9 Replies Latest reply on Feb 5, 2015 3:34 PM by Steven Hawkins

    fine grained row filters   ( multi tenant access rules )

    hanno van maanen Newbie

      hi,

      I am looking for a way to implement a fine-grained row-filter to give users access to only row's for which theyare authorized.

      The way I think about is to have a table (membership) with  two columns, user_name and organisation_id. A user can have access to data of several organisations.

       

      The data I want to "filter" has a column:  organisation_id.   I defined a row filter with the

      organisation_id in (select organisation_id from membership where user_name = user())

       

      This works correct, but the filtering is done in teiid.  All data of the table is fetched and then filtering take place in teiid.

      A moret efficient way would be to fetch first the organisaton_id's to which the user has access (select organisation_id from membership where user_name = user()  and than fetch the data with a  where clause like:  organisation_id in (1,3,4,8)

       

      Has anybody an suggestion how to implement this better??

       

      Thankx

        • 1. Re: fine grained row filters   ( multi tenant access rules )
          Ramesh Reddy Master

          Hanno,

           

          Which table is being retrieved fully? the Membership table? One suggestion is try injecting hint for dependent join like

           

          organisation_id in /*+ DJ */ (select organisation_id from membership where user_name = user())

           

          See more info here Subquery Optimization - Teiid 8.10 (draft) - Project Documentation Editor

           

          HTH.

           

          Ramesh..

          • 2. Re: fine grained row filters   ( multi tenant access rules )
            hanno van maanen Newbie

            Hi Ramesh,

            The data table which has to be filtered is fetched completly, Potential millions of rows.

             

            SELECT g_0."organisation_id", g_0."text" FROM "public"."datatable" AS g_0

             

            After that the membership table is fetched, only the rows of the current user

            SELECT g_0."organisation_id" FROM "public"."membership" AS g_0 WHERE g_0."user_name" = ?

             

            I tried to add the hint:  /*+ DJ */,  but there was no difference in the queries send to the database.


            Hanno

            • 4. Re: fine grained row filters   ( multi tenant access rules )
              hanno van maanen Newbie

              Below the query plan  (the table "membership"  is in this example named: "organization_member")

               

              ProjectNode

                + Output Columns:

                  0: tenant (string)

                  1: key (string)

                  2: text (string)

                  3: organisation_id (long)

                + Statistics:

                  0: Node Output Rows: 4

                  1: Node Next Batch Process Time: 0

                  2: Node Cumulative Next Batch Process Time: 4

                  3: Node Cumulative Process Time: 19

                  4: Node Next Batch Calls: 3

                  5: Node Blocks: 2

                + Cost Estimates:Estimated Node Cardinality: 1.3333334

                + Child 0:

                  LimitNode

                    + Output Columns:

                      0: tenant (string)

                      1: key (string)

                      2: text (string)

                      3: organisation_id (long)

                    + Statistics:

                      0: Node Output Rows: 4

                      1: Node Next Batch Process Time: 0

                      2: Node Cumulative Next Batch Process Time: 4

                      3: Node Cumulative Process Time: 19

                      4: Node Next Batch Calls: 3

                      5: Node Blocks: 2

                    + Cost Estimates:Estimated Node Cardinality: 1.3333334

                    + Child 0:

                      SelectNode

                        + Output Columns:

                          0: tenant (string)

                          1: key (string)

                          2: text (string)

                          3: organisation_id (long)

                        + Statistics:

                          0: Node Output Rows: 4

                          1: Node Next Batch Process Time: 2

                          2: Node Cumulative Next Batch Process Time: 4

                          3: Node Cumulative Process Time: 19

                          4: Node Next Batch Calls: 3

                          5: Node Blocks: 2

                        + Cost Estimates:Estimated Node Cardinality: 1.3333334

                        + Child 0:

                          AccessNode

                            + Output Columns:

                              0: organisation_id (long)

                              1: tenant (string)

                              2: key (string)

                              3: text (string)

                            + Statistics:

                              0: Node Output Rows: 4

                              1: Node Next Batch Process Time: 2

                              2: Node Cumulative Next Batch Process Time: 2

                              3: Node Cumulative Process Time: 11

                              4: Node Next Batch Calls: 2

                              5: Node Blocks: 1

                            + Cost Estimates:Estimated Node Cardinality: 4.0

                            + Query:SELECT g_0.organisation_id, g_0.tenant, g_0.key, g_0.text FROM TestHanno.testhanno AS g_0

                            + Model Name:TestHanno

                        + Criteria Subplan 0:

                          AccessNode

                            + Output Columns:organisation_id (long)

                            + Cost Estimates:Estimated Node Cardinality: 3.0

                            + Query:SELECT g_0.organisation_id FROM authorisation.organization_member AS g_0 WHERE g_0.user_name = 'user@teiid-security'

                            + Model Name:authorisation

                        + Criteria:TestHanno.testhanno.organisation_id IN /*+ DJ */ (SELECT Authorisation_DDC.organization_member.organisation_id FROM Authorisation_DDC.organization_member)

                    + Row Offset:null

                    + Row Limit:100

                + Select Columns:

                  0: TestHanno.testhanno.tenant

                  1: TestHanno.testhanno.key

                  2: TestHanno.testhanno.text

                  3: TestHanno.testhanno.organisation_id

                + Data Bytes Sent:137

              • 5. Re: fine grained row filters   ( multi tenant access rules )
                hanno van maanen Newbie

                And the debug log:

                21:16:42,303 INFO  [org.teiid.CONNECTOR] (Worker0_QueryProcessorQueue12) eQa2b4JtouAh PostgreSQLExecutionFactory Commit=true;DatabaseProductName=PostgreSQL;DatabaseProductVersion=9.3.5;DriverMajorVersion=9;DriverMajorVersion=3;DriverName=PostgreSQL Native Driver;DriverVersion=PostgreSQL 9.3 JDBC4.1 (build 1101);IsolationLevel=2

                21:16:42,306 DEBUG [org.teiid.CONNECTOR] (Worker0_QueryProcessorQueue12) eQa2b4JtouAh Initializing the capabilities for postgresql

                21:16:42,306 DEBUG [org.teiid.CONNECTOR] (Worker0_QueryProcessorQueue12) eQa2b4JtouAh Setting the database version to 9.3.5

                21:16:42,521 DEBUG [org.teiid.CONNECTOR] (Worker0_QueryProcessorQueue12) eQa2b4JtouAh eQa2b4JtouAh.6.4.0 Create State

                21:16:42,544 DEBUG [org.teiid.CONNECTOR] (Worker1_QueryProcessorQueue13) eQa2b4JtouAh eQa2b4JtouAh.6.4.0 Processing NEW request: SELECT g_0.organisation_id, g_0.tenant, g_0.key, g_0.text FROM TestHanno.testhanno AS g_0

                21:16:42,547 DEBUG [org.teiid.CONNECTOR] (Worker1_QueryProcessorQueue13) eQa2b4JtouAh eQa2b4JtouAh.6.4.0 Obtained execution

                21:16:42,551 DEBUG [org.teiid.CONNECTOR] (Worker1_QueryProcessorQueue13) eQa2b4JtouAh Source-specific command: SELECT g_0."organisation_id", g_0."tenant", g_0."key", g_0."text" FROM "public"."testhanno" AS g_0

                21:16:42,560 DEBUG [org.teiid.CONNECTOR] (Worker1_QueryProcessorQueue13) eQa2b4JtouAh eQa2b4JtouAh.6.4.0 Executed command

                21:16:42,560 DEBUG [org.teiid.CONNECTOR] (Worker1_QueryProcessorQueue13) eQa2b4JtouAh eQa2b4JtouAh.6.4.0 Processing MORE request

                21:16:42,560 DEBUG [org.teiid.CONNECTOR] (Worker1_QueryProcessorQueue13) eQa2b4JtouAh eQa2b4JtouAh.6.4.0 Getting results from connector

                21:16:42,560 DEBUG [org.teiid.CONNECTOR] (Worker1_QueryProcessorQueue13) eQa2b4JtouAh eQa2b4JtouAh.6.4.0 Obtained last batch, total row count: 4

                21:16:42,561 DEBUG [org.teiid.CONNECTOR] (Worker0_QueryProcessorQueue14) eQa2b4JtouAh eQa2b4JtouAh.6.4.0 Remove State

                21:16:42,562 DEBUG [org.teiid.CONNECTOR] (Worker0_QueryProcessorQueue14) eQa2b4JtouAh eQa2b4JtouAh.6.4.0 Processing Close : SELECT g_0.organisation_id, g_0.tenant, g_0.key, g_0.text FROM TestHanno.testhanno AS g_0

                21:16:42,567 DEBUG [org.teiid.CONNECTOR] (Worker0_QueryProcessorQueue14) eQa2b4JtouAh eQa2b4JtouAh.6.4.0 Closed execution

                21:16:42,567 DEBUG [org.teiid.CONNECTOR] (Worker0_QueryProcessorQueue14) eQa2b4JtouAh eQa2b4JtouAh.6.4.0 Closed connection

                21:16:42,568 DEBUG [org.teiid.CONNECTOR] (Worker0_QueryProcessorQueue14) eQa2b4JtouAh eQa2b4JtouAh.6.0.1 Create State

                21:16:42,570 DEBUG [org.teiid.CONNECTOR] (Worker2_QueryProcessorQueue15) eQa2b4JtouAh eQa2b4JtouAh.6.0.1 Processing NEW request: SELECT g_0.organisation_id FROM authorisation.organization_member AS g_0 WHERE g_0.user_name = 'user@teiid-security'

                21:16:42,579 DEBUG [org.teiid.CONNECTOR] (Worker2_QueryProcessorQueue15) eQa2b4JtouAh eQa2b4JtouAh.6.0.1 Obtained execution

                21:16:42,580 DEBUG [org.teiid.CONNECTOR] (Worker2_QueryProcessorQueue15) eQa2b4JtouAh Source-specific command: SELECT g_0."organisation_id" FROM "public"."organization_member" AS g_0 WHERE g_0."user_name" = ?

                21:16:42,583 DEBUG [org.teiid.CONNECTOR] (Worker2_QueryProcessorQueue15) eQa2b4JtouAh eQa2b4JtouAh.6.0.1 Executed command

                21:16:42,583 DEBUG [org.teiid.CONNECTOR] (Worker2_QueryProcessorQueue15) eQa2b4JtouAh eQa2b4JtouAh.6.0.1 Processing MORE request

                21:16:42,583 DEBUG [org.teiid.CONNECTOR] (Worker2_QueryProcessorQueue15) eQa2b4JtouAh eQa2b4JtouAh.6.0.1 Getting results from connector

                21:16:42,583 DEBUG [org.teiid.CONNECTOR] (Worker2_QueryProcessorQueue15) eQa2b4JtouAh eQa2b4JtouAh.6.0.1 Obtained last batch, total row count: 3

                21:16:42,584 DEBUG [org.teiid.CONNECTOR] (Worker1_QueryProcessorQueue16) eQa2b4JtouAh eQa2b4JtouAh.6.0.1 Remove State

                21:16:42,584 DEBUG [org.teiid.CONNECTOR] (Worker1_QueryProcessorQueue16) eQa2b4JtouAh eQa2b4JtouAh.6.0.1 Processing Close : SELECT g_0.organisation_id FROM authorisation.organization_member AS g_0 WHERE g_0.user_name = 'user@teiid-security'

                21:16:42,584 DEBUG [org.teiid.CONNECTOR] (Worker1_QueryProcessorQueue16) eQa2b4JtouAh eQa2b4JtouAh.6.0.1 Closed execution

                21:16:42,584 DEBUG [org.teiid.CONNECTOR] (Worker1_QueryProcessorQueue16) eQa2b4JtouAh eQa2b4JtouAh.6.0.1 Closed connection

                • 6. Re: fine grained row filters   ( multi tenant access rules )
                  Steven Hawkins Master

                  The debug log looks to only contain connector related logs.  We would need either the plan debug log - "set showplan debug" or a more complete debug log - such as setting all of org.teiid to log at a debug level.

                  • 7. Re: fine grained row filters   ( multi tenant access rules )
                    hanno van maanen Newbie

                    Below the "showplan debug" output:

                     

                     

                     

                    ============================================================================

                    USER COMMAND:

                    SELECT TestHanno_DDC.testhanno.tenant, TestHanno_DDC.testhanno.key, TestHanno_DDC.testhanno.text, TestHanno_DDC.testhanno.organisation_id FROM TestHanno_DDC.testhanno LIMIT 100

                     

                     

                    ----------------------------------------------------------------------------

                    OPTIMIZE:

                    SELECT TestHanno_DDC.testhanno.tenant, TestHanno_DDC.testhanno.key, TestHanno_DDC.testhanno.text, TestHanno_DDC.testhanno.organisation_id FROM TestHanno_DDC.testhanno LIMIT 100

                     

                     

                    ----------------------------------------------------------------------------

                    GENERATE CANONICAL:

                    SELECT TestHanno_DDC.testhanno.tenant, TestHanno_DDC.testhanno.key, TestHanno_DDC.testhanno.text, TestHanno_DDC.testhanno.organisation_id FROM TestHanno_DDC.testhanno LIMIT 100

                     

                     

                    CANONICAL PLAN:

                    TupleLimit(groups=[], props={MAX_TUPLE_LIMIT=100})

                      Project(groups=[TestHanno_DDC.testhanno], props={PROJECT_COLS=[TestHanno_DDC.testhanno.tenant, TestHanno_DDC.testhanno.key, TestHanno_DDC.testhanno.text, TestHanno_DDC.testhanno.organisation_id]})

                        Source(groups=[TestHanno_DDC.testhanno], props={NESTED_COMMAND=SELECT TestHanno_VBL.testhanno.tenant, TestHanno_VBL.testhanno.key, TestHanno_VBL.testhanno.text, TestHanno_VBL.testhanno.organisation_id FROM TestHanno_VBL.testhanno, SYMBOL_MAP={TestHanno_DDC.testhanno.tenant=TestHanno_VBL.testhanno.tenant, TestHanno_DDC.testhanno.key=TestHanno_VBL.testhanno.key, TestHanno_DDC.testhanno.text=TestHanno_VBL.testhanno.text, TestHanno_DDC.testhanno.organisation_id=TestHanno_VBL.testhanno.organisation_id}})

                          Project(groups=[TestHanno_VBL.testhanno], props={PROJECT_COLS=[TestHanno_VBL.testhanno.tenant, TestHanno_VBL.testhanno.key, TestHanno_VBL.testhanno.text, TestHanno_VBL.testhanno.organisation_id]})

                            Source(groups=[TestHanno_VBL.testhanno], props={NESTED_COMMAND=SELECT TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id FROM TestHanno.testhanno, SYMBOL_MAP={TestHanno_VBL.testhanno.tenant=TestHanno.testhanno.tenant, TestHanno_VBL.testhanno.key=TestHanno.testhanno.key, TestHanno_VBL.testhanno.text=TestHanno.testhanno.text, TestHanno_VBL.testhanno.organisation_id=TestHanno.testhanno.organisation_id}})

                              Project(groups=[TestHanno.testhanno], props={PROJECT_COLS=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id]})

                                Source(groups=[TestHanno.testhanno])

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING PlaceAccess

                     

                     

                    AFTER:

                    TupleLimit(groups=[], props={MAX_TUPLE_LIMIT=100})

                      Project(groups=[TestHanno_DDC.testhanno], props={PROJECT_COLS=[TestHanno_DDC.testhanno.tenant, TestHanno_DDC.testhanno.key, TestHanno_DDC.testhanno.text, TestHanno_DDC.testhanno.organisation_id]})

                        Source(groups=[TestHanno_DDC.testhanno], props={NESTED_COMMAND=SELECT TestHanno_VBL.testhanno.tenant, TestHanno_VBL.testhanno.key, TestHanno_VBL.testhanno.text, TestHanno_VBL.testhanno.organisation_id FROM TestHanno_VBL.testhanno, SYMBOL_MAP={TestHanno_DDC.testhanno.tenant=TestHanno_VBL.testhanno.tenant, TestHanno_DDC.testhanno.key=TestHanno_VBL.testhanno.key, TestHanno_DDC.testhanno.text=TestHanno_VBL.testhanno.text, TestHanno_DDC.testhanno.organisation_id=TestHanno_VBL.testhanno.organisation_id}})

                          Project(groups=[TestHanno_VBL.testhanno], props={PROJECT_COLS=[TestHanno_VBL.testhanno.tenant, TestHanno_VBL.testhanno.key, TestHanno_VBL.testhanno.text, TestHanno_VBL.testhanno.organisation_id]})

                            Source(groups=[TestHanno_VBL.testhanno], props={NESTED_COMMAND=SELECT TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id FROM TestHanno.testhanno, SYMBOL_MAP={TestHanno_VBL.testhanno.tenant=TestHanno.testhanno.tenant, TestHanno_VBL.testhanno.key=TestHanno.testhanno.key, TestHanno_VBL.testhanno.text=TestHanno.testhanno.text, TestHanno_VBL.testhanno.organisation_id=TestHanno.testhanno.organisation_id}})

                              Project(groups=[TestHanno.testhanno], props={PROJECT_COLS=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id]})

                                Access(groups=[TestHanno.testhanno], props={SOURCE_HINT=null, MODEL_ID=Schema name=TestHanno, nameInSource=null, uuid=mmuuid:22e35fbb-7a27-4004-8faf-75ee883f36cb})

                                  Source(groups=[TestHanno.testhanno])

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING ApplySecurity

                     

                     

                    ----------------------------------------------------------------------------

                    OPTIMIZE:

                    SELECT Authorisation_DDC.organization_member.organisation_id FROM Authorisation_DDC.organization_member

                     

                     

                    ----------------------------------------------------------------------------

                    GENERATE CANONICAL:

                    SELECT Authorisation_DDC.organization_member.organisation_id FROM Authorisation_DDC.organization_member

                     

                     

                    CANONICAL PLAN:

                    Project(groups=[Authorisation_DDC.organization_member], props={PROJECT_COLS=[Authorisation_DDC.organization_member.organisation_id]})

                      Source(groups=[Authorisation_DDC.organization_member], props={NESTED_COMMAND=SELECT Authorisation_VBL.organization_member.user_name, Authorisation_VBL.organization_member.organisation_id FROM Authorisation_VBL.organization_member, SYMBOL_MAP={Authorisation_DDC.organization_member.user_name=Authorisation_VBL.organization_member.user_name, Authorisation_DDC.organization_member.organisation_id=Authorisation_VBL.organization_member.organisation_id}})

                        Project(groups=[Authorisation_VBL.organization_member], props={PROJECT_COLS=[Authorisation_VBL.organization_member.user_name, Authorisation_VBL.organization_member.organisation_id]})

                          Source(groups=[Authorisation_VBL.organization_member], props={NESTED_COMMAND=SELECT authorisation.organization_member.user_name, authorisation.organization_member.organisation_id FROM authorisation.organization_member, SYMBOL_MAP={Authorisation_VBL.organization_member.user_name=authorisation.organization_member.user_name, Authorisation_VBL.organization_member.organisation_id=authorisation.organization_member.organisation_id}})

                            Project(groups=[authorisation.organization_member], props={PROJECT_COLS=[authorisation.organization_member.user_name, authorisation.organization_member.organisation_id]})

                              Source(groups=[authorisation.organization_member])

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING PlaceAccess

                     

                     

                    AFTER:

                    Project(groups=[Authorisation_DDC.organization_member], props={PROJECT_COLS=[Authorisation_DDC.organization_member.organisation_id]})

                      Source(groups=[Authorisation_DDC.organization_member], props={NESTED_COMMAND=SELECT Authorisation_VBL.organization_member.user_name, Authorisation_VBL.organization_member.organisation_id FROM Authorisation_VBL.organization_member, SYMBOL_MAP={Authorisation_DDC.organization_member.user_name=Authorisation_VBL.organization_member.user_name, Authorisation_DDC.organization_member.organisation_id=Authorisation_VBL.organization_member.organisation_id}})

                        Project(groups=[Authorisation_VBL.organization_member], props={PROJECT_COLS=[Authorisation_VBL.organization_member.user_name, Authorisation_VBL.organization_member.organisation_id]})

                          Source(groups=[Authorisation_VBL.organization_member], props={NESTED_COMMAND=SELECT authorisation.organization_member.user_name, authorisation.organization_member.organisation_id FROM authorisation.organization_member, SYMBOL_MAP={Authorisation_VBL.organization_member.user_name=authorisation.organization_member.user_name, Authorisation_VBL.organization_member.organisation_id=authorisation.organization_member.organisation_id}})

                            Project(groups=[authorisation.organization_member], props={PROJECT_COLS=[authorisation.organization_member.user_name, authorisation.organization_member.organisation_id]})

                              Access(groups=[authorisation.organization_member], props={SOURCE_HINT=null, MODEL_ID=Schema name=authorisation, nameInSource=null, uuid=mmuuid:0e62fba1-73c9-4934-b9d2-d1393f052e8c})

                                Source(groups=[authorisation.organization_member])

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING ApplySecurity

                     

                     

                    AFTER:

                    Project(groups=[Authorisation_DDC.organization_member], props={PROJECT_COLS=[Authorisation_DDC.organization_member.organisation_id]})

                      Select(groups=[Authorisation_DDC.organization_member], props={SELECT_CRITERIA=Authorisation_DDC.organization_member.user_name = 'user@teiid-security'})

                        Source(groups=[Authorisation_DDC.organization_member], props={NESTED_COMMAND=SELECT Authorisation_VBL.organization_member.user_name, Authorisation_VBL.organization_member.organisation_id FROM Authorisation_VBL.organization_member, SYMBOL_MAP={Authorisation_DDC.organization_member.user_name=Authorisation_VBL.organization_member.user_name, Authorisation_DDC.organization_member.organisation_id=Authorisation_VBL.organization_member.organisation_id}})

                          Project(groups=[Authorisation_VBL.organization_member])

                            Source(groups=[Authorisation_VBL.organization_member])

                              Project(groups=[authorisation.organization_member])

                                Access(groups=[authorisation.organization_member])

                                  Source(groups=[authorisation.organization_member])

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING AssignOutputElements

                     

                     

                    AFTER:

                    Project(groups=[Authorisation_DDC.organization_member], props={PROJECT_COLS=[Authorisation_DDC.organization_member.organisation_id], OUTPUT_COLS=[Authorisation_DDC.organization_member.organisation_id]})

                      Select(groups=[Authorisation_DDC.organization_member], props={SELECT_CRITERIA=Authorisation_DDC.organization_member.user_name = 'user@teiid-security', OUTPUT_COLS=[Authorisation_DDC.organization_member.organisation_id]})

                        Source(groups=[Authorisation_DDC.organization_member], props={NESTED_COMMAND=SELECT Authorisation_VBL.organization_member.user_name, Authorisation_VBL.organization_member.organisation_id FROM Authorisation_VBL.organization_member, SYMBOL_MAP={Authorisation_DDC.organization_member.user_name=Authorisation_VBL.organization_member.user_name, Authorisation_DDC.organization_member.organisation_id=Authorisation_VBL.organization_member.organisation_id}, OUTPUT_COLS=[Authorisation_DDC.organization_member.user_name, Authorisation_DDC.organization_member.organisation_id]})

                          Project(groups=[Authorisation_VBL.organization_member], props={PROJECT_COLS=[Authorisation_VBL.organization_member.user_name, Authorisation_VBL.organization_member.organisation_id], OUTPUT_COLS=[Authorisation_VBL.organization_member.user_name, Authorisation_VBL.organization_member.organisation_id]})

                            Source(groups=[Authorisation_VBL.organization_member], props={NESTED_COMMAND=SELECT authorisation.organization_member.user_name, authorisation.organization_member.organisation_id FROM authorisation.organization_member, SYMBOL_MAP={Authorisation_VBL.organization_member.user_name=authorisation.organization_member.user_name, Authorisation_VBL.organization_member.organisation_id=authorisation.organization_member.organisation_id}, OUTPUT_COLS=[Authorisation_VBL.organization_member.user_name, Authorisation_VBL.organization_member.organisation_id]})

                              Project(groups=[authorisation.organization_member], props={PROJECT_COLS=[authorisation.organization_member.user_name, authorisation.organization_member.organisation_id], OUTPUT_COLS=[authorisation.organization_member.user_name, authorisation.organization_member.organisation_id]})

                                Access(groups=[authorisation.organization_member], props={SOURCE_HINT=null, MODEL_ID=Schema name=authorisation, nameInSource=null, uuid=mmuuid:0e62fba1-73c9-4934-b9d2-d1393f052e8c, OUTPUT_COLS=[authorisation.organization_member.user_name, authorisation.organization_member.organisation_id]})

                                  Source(groups=[authorisation.organization_member], props={OUTPUT_COLS=[authorisation.organization_member.user_name, authorisation.organization_member.organisation_id]})

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING MergeVirtual

                     

                     

                    AFTER:

                    Project(groups=[authorisation.organization_member], props={PROJECT_COLS=[authorisation.organization_member.organisation_id], OUTPUT_COLS=[Authorisation_DDC.organization_member.organisation_id]})

                      Select(groups=[authorisation.organization_member], props={SELECT_CRITERIA=authorisation.organization_member.user_name = 'user@teiid-security', OUTPUT_COLS=[Authorisation_DDC.organization_member.organisation_id]})

                        Access(groups=[authorisation.organization_member], props={SOURCE_HINT=null, MODEL_ID=Schema name=authorisation, nameInSource=null, uuid=mmuuid:0e62fba1-73c9-4934-b9d2-d1393f052e8c, OUTPUT_COLS=[authorisation.organization_member.user_name, authorisation.organization_member.organisation_id]})

                          Source(groups=[authorisation.organization_member])

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING CleanCriteria

                     

                     

                    AFTER:

                    Project(groups=[authorisation.organization_member], props={PROJECT_COLS=[authorisation.organization_member.organisation_id], OUTPUT_COLS=null})

                      Select(groups=[authorisation.organization_member], props={SELECT_CRITERIA=authorisation.organization_member.user_name = 'user@teiid-security', OUTPUT_COLS=null})

                        Access(groups=[authorisation.organization_member], props={SOURCE_HINT=null, MODEL_ID=Schema name=authorisation, nameInSource=null, uuid=mmuuid:0e62fba1-73c9-4934-b9d2-d1393f052e8c, OUTPUT_COLS=null})

                          Source(groups=[authorisation.organization_member], props={OUTPUT_COLS=null})

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING RaiseAccess

                     

                     

                    AFTER:

                    Access(groups=[authorisation.organization_member], props={SOURCE_HINT=null, MODEL_ID=Schema name=authorisation, nameInSource=null, uuid=mmuuid:0e62fba1-73c9-4934-b9d2-d1393f052e8c, OUTPUT_COLS=null})

                      Project(groups=[authorisation.organization_member], props={PROJECT_COLS=[authorisation.organization_member.organisation_id], OUTPUT_COLS=null})

                        Select(groups=[authorisation.organization_member], props={SELECT_CRITERIA=authorisation.organization_member.user_name = 'user@teiid-security', OUTPUT_COLS=null})

                          Source(groups=[authorisation.organization_member], props={OUTPUT_COLS=null})

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING AssignOutputElements

                     

                     

                    AFTER:

                    Access(groups=[authorisation.organization_member], props={SOURCE_HINT=null, MODEL_ID=Schema name=authorisation, nameInSource=null, uuid=mmuuid:0e62fba1-73c9-4934-b9d2-d1393f052e8c, OUTPUT_COLS=[authorisation.organization_member.organisation_id]})

                      Project(groups=[authorisation.organization_member], props={PROJECT_COLS=[authorisation.organization_member.organisation_id], OUTPUT_COLS=[authorisation.organization_member.organisation_id]})

                        Select(groups=[authorisation.organization_member], props={SELECT_CRITERIA=authorisation.organization_member.user_name = 'user@teiid-security', OUTPUT_COLS=[authorisation.organization_member.organisation_id]})

                          Source(groups=[authorisation.organization_member], props={OUTPUT_COLS=[authorisation.organization_member.user_name, authorisation.organization_member.organisation_id]})

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING CalculateCost

                     

                     

                    AFTER:

                    Access(groups=[authorisation.organization_member], props={SOURCE_HINT=null, MODEL_ID=Schema name=authorisation, nameInSource=null, uuid=mmuuid:0e62fba1-73c9-4934-b9d2-d1393f052e8c, OUTPUT_COLS=[authorisation.organization_member.organisation_id], EST_CARDINALITY=3.0, EST_COL_STATS={authorisation.organization_member.organisation_id=[-1.0, -1.0]}})

                      Project(groups=[authorisation.organization_member], props={PROJECT_COLS=[authorisation.organization_member.organisation_id], OUTPUT_COLS=[authorisation.organization_member.organisation_id], EST_CARDINALITY=3.0, EST_COL_STATS={authorisation.organization_member.organisation_id=[-1.0, -1.0]}})

                        Select(groups=[authorisation.organization_member], props={SELECT_CRITERIA=authorisation.organization_member.user_name = 'user@teiid-security', OUTPUT_COLS=[authorisation.organization_member.organisation_id], EST_CARDINALITY=3.0, EST_COL_STATS={authorisation.organization_member.organisation_id=[-1.0, -1.0]}})

                          Source(groups=[authorisation.organization_member], props={OUTPUT_COLS=[authorisation.organization_member.user_name, authorisation.organization_member.organisation_id], EST_COL_STATS={authorisation.organization_member.user_name=[-1.0, -1.0], authorisation.organization_member.organisation_id=[-1.0, -1.0]}, EST_CARDINALITY=3.0})

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING PlanSorts

                     

                     

                    AFTER:

                    Access(groups=[authorisation.organization_member])

                      Project(groups=[authorisation.organization_member])

                        Select(groups=[authorisation.organization_member])

                          Source(groups=[authorisation.organization_member])

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING CollapseSource

                     

                     

                    AFTER:

                    Access(groups=[authorisation.organization_member], props={SOURCE_HINT=null, MODEL_ID=Schema name=authorisation, nameInSource=null, uuid=mmuuid:0e62fba1-73c9-4934-b9d2-d1393f052e8c, OUTPUT_COLS=[authorisation.organization_member.organisation_id], EST_CARDINALITY=3.0, EST_COL_STATS={authorisation.organization_member.organisation_id=[-1.0, -1.0]}, ATOMIC_REQUEST=SELECT authorisation.organization_member.organisation_id FROM authorisation.organization_member WHERE authorisation.organization_member.user_name = 'user@teiid-security'})

                     

                     

                     

                     

                    ============================================================================

                    CONVERTING PLAN TREE TO PROCESS TREE

                     

                     

                    PROCESS PLAN =

                    AccessNode(0) output=[authorisation.organization_member.organisation_id] SELECT g_0.organisation_id FROM authorisation.organization_member AS g_0 WHERE g_0.user_name = 'user@teiid-security'

                     

                     

                    ============================================================================

                     

                     

                    ----------------------------------------------------------------------------

                    OPTIMIZATION COMPLETE:

                    PROCESSOR PLAN:

                    AccessNode(0) output=[authorisation.organization_member.organisation_id] SELECT g_0.organisation_id FROM authorisation.organization_member AS g_0 WHERE g_0.user_name = 'user@teiid-security'

                     

                     

                    ============================================================================

                     

                     

                    AFTER:

                    TupleLimit(groups=[])

                      Project(groups=[TestHanno_DDC.testhanno], props={PROJECT_COLS=[TestHanno_DDC.testhanno.tenant, TestHanno_DDC.testhanno.key, TestHanno_DDC.testhanno.text, TestHanno_DDC.testhanno.organisation_id]})

                        Select(groups=[TestHanno_DDC.testhanno], props={SELECT_CRITERIA=TestHanno_DDC.testhanno.organisation_id IN /*+ DJ */ (SELECT Authorisation_DDC.organization_member.organisation_id FROM Authorisation_DDC.organization_member)})

                          Source(groups=[TestHanno_DDC.testhanno], props={NESTED_COMMAND=SELECT TestHanno_VBL.testhanno.tenant, TestHanno_VBL.testhanno.key, TestHanno_VBL.testhanno.text, TestHanno_VBL.testhanno.organisation_id FROM TestHanno_VBL.testhanno, SYMBOL_MAP={TestHanno_DDC.testhanno.tenant=TestHanno_VBL.testhanno.tenant, TestHanno_DDC.testhanno.key=TestHanno_VBL.testhanno.key, TestHanno_DDC.testhanno.text=TestHanno_VBL.testhanno.text, TestHanno_DDC.testhanno.organisation_id=TestHanno_VBL.testhanno.organisation_id}})

                            Project(groups=[TestHanno_VBL.testhanno])

                              Source(groups=[TestHanno_VBL.testhanno])

                                Project(groups=[TestHanno.testhanno])

                                  Access(groups=[TestHanno.testhanno])

                                    Source(groups=[TestHanno.testhanno])

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING AssignOutputElements

                     

                     

                    AFTER:

                    TupleLimit(groups=[], props={MAX_TUPLE_LIMIT=100, OUTPUT_COLS=[TestHanno_DDC.testhanno.tenant, TestHanno_DDC.testhanno.key, TestHanno_DDC.testhanno.text, TestHanno_DDC.testhanno.organisation_id]})

                      Project(groups=[TestHanno_DDC.testhanno], props={PROJECT_COLS=[TestHanno_DDC.testhanno.tenant, TestHanno_DDC.testhanno.key, TestHanno_DDC.testhanno.text, TestHanno_DDC.testhanno.organisation_id], OUTPUT_COLS=[TestHanno_DDC.testhanno.tenant, TestHanno_DDC.testhanno.key, TestHanno_DDC.testhanno.text, TestHanno_DDC.testhanno.organisation_id]})

                        Select(groups=[TestHanno_DDC.testhanno], props={SELECT_CRITERIA=TestHanno_DDC.testhanno.organisation_id IN /*+ DJ */ (SELECT Authorisation_DDC.organization_member.organisation_id FROM Authorisation_DDC.organization_member), OUTPUT_COLS=[TestHanno_DDC.testhanno.tenant, TestHanno_DDC.testhanno.key, TestHanno_DDC.testhanno.text, TestHanno_DDC.testhanno.organisation_id]})

                          Source(groups=[TestHanno_DDC.testhanno], props={NESTED_COMMAND=SELECT TestHanno_VBL.testhanno.tenant, TestHanno_VBL.testhanno.key, TestHanno_VBL.testhanno.text, TestHanno_VBL.testhanno.organisation_id FROM TestHanno_VBL.testhanno, SYMBOL_MAP={TestHanno_DDC.testhanno.organisation_id=TestHanno_VBL.testhanno.organisation_id, TestHanno_DDC.testhanno.tenant=TestHanno_VBL.testhanno.tenant, TestHanno_DDC.testhanno.key=TestHanno_VBL.testhanno.key, TestHanno_DDC.testhanno.text=TestHanno_VBL.testhanno.text}, OUTPUT_COLS=[TestHanno_DDC.testhanno.organisation_id, TestHanno_DDC.testhanno.tenant, TestHanno_DDC.testhanno.key, TestHanno_DDC.testhanno.text]})

                            Project(groups=[TestHanno_VBL.testhanno], props={PROJECT_COLS=[TestHanno_VBL.testhanno.organisation_id, TestHanno_VBL.testhanno.tenant, TestHanno_VBL.testhanno.key, TestHanno_VBL.testhanno.text], OUTPUT_COLS=[TestHanno_VBL.testhanno.organisation_id, TestHanno_VBL.testhanno.tenant, TestHanno_VBL.testhanno.key, TestHanno_VBL.testhanno.text]})

                              Source(groups=[TestHanno_VBL.testhanno], props={NESTED_COMMAND=SELECT TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id FROM TestHanno.testhanno, SYMBOL_MAP={TestHanno_VBL.testhanno.organisation_id=TestHanno.testhanno.organisation_id, TestHanno_VBL.testhanno.tenant=TestHanno.testhanno.tenant, TestHanno_VBL.testhanno.key=TestHanno.testhanno.key, TestHanno_VBL.testhanno.text=TestHanno.testhanno.text}, OUTPUT_COLS=[TestHanno_VBL.testhanno.organisation_id, TestHanno_VBL.testhanno.tenant, TestHanno_VBL.testhanno.key, TestHanno_VBL.testhanno.text]})

                                Project(groups=[TestHanno.testhanno], props={PROJECT_COLS=[TestHanno.testhanno.organisation_id, TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text], OUTPUT_COLS=[TestHanno.testhanno.organisation_id, TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text]})

                                  Access(groups=[TestHanno.testhanno], props={SOURCE_HINT=null, MODEL_ID=Schema name=TestHanno, nameInSource=null, uuid=mmuuid:22e35fbb-7a27-4004-8faf-75ee883f36cb, OUTPUT_COLS=[TestHanno.testhanno.organisation_id, TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text]})

                                    Source(groups=[TestHanno.testhanno], props={OUTPUT_COLS=[TestHanno.testhanno.organisation_id, TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text]})

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING MergeVirtual

                     

                     

                    AFTER:

                    TupleLimit(groups=[])

                      Project(groups=[TestHanno.testhanno], props={PROJECT_COLS=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id], OUTPUT_COLS=[TestHanno_DDC.testhanno.tenant, TestHanno_DDC.testhanno.key, TestHanno_DDC.testhanno.text, TestHanno_DDC.testhanno.organisation_id]})

                        Select(groups=[TestHanno.testhanno], props={SELECT_CRITERIA=TestHanno.testhanno.organisation_id IN /*+ DJ */ (SELECT Authorisation_DDC.organization_member.organisation_id FROM Authorisation_DDC.organization_member), OUTPUT_COLS=[TestHanno_DDC.testhanno.tenant, TestHanno_DDC.testhanno.key, TestHanno_DDC.testhanno.text, TestHanno_DDC.testhanno.organisation_id]})

                          Access(groups=[TestHanno.testhanno], props={SOURCE_HINT=null, MODEL_ID=Schema name=TestHanno, nameInSource=null, uuid=mmuuid:22e35fbb-7a27-4004-8faf-75ee883f36cb, OUTPUT_COLS=[TestHanno.testhanno.organisation_id, TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text]})

                            Source(groups=[TestHanno.testhanno])

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING CleanCriteria

                     

                     

                    AFTER:

                    TupleLimit(groups=[], props={MAX_TUPLE_LIMIT=100, OUTPUT_COLS=null})

                      Project(groups=[TestHanno.testhanno], props={PROJECT_COLS=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id], OUTPUT_COLS=null})

                        Select(groups=[TestHanno.testhanno], props={SELECT_CRITERIA=TestHanno.testhanno.organisation_id IN /*+ DJ */ (SELECT Authorisation_DDC.organization_member.organisation_id FROM Authorisation_DDC.organization_member), OUTPUT_COLS=null})

                          Access(groups=[TestHanno.testhanno], props={SOURCE_HINT=null, MODEL_ID=Schema name=TestHanno, nameInSource=null, uuid=mmuuid:22e35fbb-7a27-4004-8faf-75ee883f36cb, OUTPUT_COLS=null})

                            Source(groups=[TestHanno.testhanno], props={OUTPUT_COLS=null})

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING RaiseAccess

                    LOW Relational Planner Subquery cannot be pushed down TestHanno - SELECT Authorisation_DDC.organization_member.organisation_id FROM Authorisation_DDC.organization_member was not pushed

                     

                     

                    AFTER:

                    TupleLimit(groups=[])

                      Project(groups=[TestHanno.testhanno])

                        Select(groups=[TestHanno.testhanno], props={SELECT_CRITERIA=TestHanno.testhanno.organisation_id IN /*+ DJ */ (SELECT Authorisation_DDC.organization_member.organisation_id FROM Authorisation_DDC.organization_member), OUTPUT_COLS=null})

                          Access(groups=[TestHanno.testhanno], props={SOURCE_HINT=null, MODEL_ID=Schema name=TestHanno, nameInSource=null, uuid=mmuuid:22e35fbb-7a27-4004-8faf-75ee883f36cb, OUTPUT_COLS=null})

                            Source(groups=[TestHanno.testhanno])

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING PushLimit

                     

                     

                    AFTER:

                    Project(groups=[TestHanno.testhanno], props={PROJECT_COLS=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id], OUTPUT_COLS=null, SOURCE_HINT=null})

                      TupleLimit(groups=[], props={MAX_TUPLE_LIMIT=100, OUTPUT_COLS=null})

                        Select(groups=[TestHanno.testhanno], props={SELECT_CRITERIA=TestHanno.testhanno.organisation_id IN /*+ DJ */ (SELECT Authorisation_DDC.organization_member.organisation_id FROM Authorisation_DDC.organization_member), OUTPUT_COLS=null})

                          Access(groups=[TestHanno.testhanno])

                            Source(groups=[TestHanno.testhanno])

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING AssignOutputElements

                     

                     

                    AFTER:

                    Project(groups=[TestHanno.testhanno], props={PROJECT_COLS=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id], OUTPUT_COLS=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id], SOURCE_HINT=null})

                      TupleLimit(groups=[], props={MAX_TUPLE_LIMIT=100, OUTPUT_COLS=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id]})

                        Select(groups=[TestHanno.testhanno], props={SELECT_CRITERIA=TestHanno.testhanno.organisation_id IN /*+ DJ */ (SELECT Authorisation_DDC.organization_member.organisation_id FROM Authorisation_DDC.organization_member), OUTPUT_COLS=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id]})

                          Access(groups=[TestHanno.testhanno], props={SOURCE_HINT=null, MODEL_ID=Schema name=TestHanno, nameInSource=null, uuid=mmuuid:22e35fbb-7a27-4004-8faf-75ee883f36cb, OUTPUT_COLS=[TestHanno.testhanno.organisation_id, TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text]})

                            Source(groups=[TestHanno.testhanno], props={OUTPUT_COLS=[TestHanno.testhanno.organisation_id, TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text]})

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING CalculateCost

                     

                     

                    AFTER:

                    Project(groups=[TestHanno.testhanno], props={PROJECT_COLS=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id], OUTPUT_COLS=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id], SOURCE_HINT=null, EST_CARDINALITY=1.3333334, EST_COL_STATS={TestHanno.testhanno.tenant=[-1.0, -1.0], TestHanno.testhanno.key=[-1.0, -1.0], TestHanno.testhanno.text=[-1.0, -1.0], TestHanno.testhanno.organisation_id=[-1.0, -1.0]}})

                      TupleLimit(groups=[], props={MAX_TUPLE_LIMIT=100, OUTPUT_COLS=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id], EST_CARDINALITY=1.3333334, EST_COL_STATS={TestHanno.testhanno.tenant=[-1.0, -1.0], TestHanno.testhanno.key=[-1.0, -1.0], TestHanno.testhanno.text=[-1.0, -1.0], TestHanno.testhanno.organisation_id=[-1.0, -1.0]}})

                        Select(groups=[TestHanno.testhanno], props={SELECT_CRITERIA=TestHanno.testhanno.organisation_id IN /*+ DJ */ (SELECT Authorisation_DDC.organization_member.organisation_id FROM Authorisation_DDC.organization_member), OUTPUT_COLS=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id], EST_CARDINALITY=1.3333334, EST_COL_STATS={TestHanno.testhanno.tenant=[-1.0, -1.0], TestHanno.testhanno.key=[-1.0, -1.0], TestHanno.testhanno.text=[-1.0, -1.0], TestHanno.testhanno.organisation_id=[-1.0, -1.0]}})

                          Access(groups=[TestHanno.testhanno], props={SOURCE_HINT=null, MODEL_ID=Schema name=TestHanno, nameInSource=null, uuid=mmuuid:22e35fbb-7a27-4004-8faf-75ee883f36cb, OUTPUT_COLS=[TestHanno.testhanno.organisation_id, TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text], EST_CARDINALITY=4.0, EST_COL_STATS={TestHanno.testhanno.organisation_id=[-1.0, -1.0], TestHanno.testhanno.tenant=[-1.0, -1.0], TestHanno.testhanno.key=[-1.0, -1.0], TestHanno.testhanno.text=[-1.0, -1.0]}})

                            Source(groups=[TestHanno.testhanno], props={OUTPUT_COLS=[TestHanno.testhanno.organisation_id, TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text], EST_COL_STATS={TestHanno.testhanno.organisation_id=[-1.0, -1.0], TestHanno.testhanno.tenant=[-1.0, -1.0], TestHanno.testhanno.key=[-1.0, -1.0], TestHanno.testhanno.text=[-1.0, -1.0]}, EST_CARDINALITY=4.0})

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING PlanSorts

                     

                     

                    AFTER:

                    Project(groups=[TestHanno.testhanno])

                      TupleLimit(groups=[])

                        Select(groups=[TestHanno.testhanno])

                          Access(groups=[TestHanno.testhanno])

                            Source(groups=[TestHanno.testhanno])

                     

                     

                     

                     

                    ============================================================================

                    EXECUTING CollapseSource

                     

                     

                    AFTER:

                    Project(groups=[TestHanno.testhanno])

                      TupleLimit(groups=[])

                        Select(groups=[TestHanno.testhanno])

                          Access(groups=[TestHanno.testhanno], props={SOURCE_HINT=null, MODEL_ID=Schema name=TestHanno, nameInSource=null, uuid=mmuuid:22e35fbb-7a27-4004-8faf-75ee883f36cb, OUTPUT_COLS=[TestHanno.testhanno.organisation_id, TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text], EST_CARDINALITY=4.0, EST_COL_STATS={TestHanno.testhanno.organisation_id=[-1.0, -1.0], TestHanno.testhanno.tenant=[-1.0, -1.0], TestHanno.testhanno.key=[-1.0, -1.0], TestHanno.testhanno.text=[-1.0, -1.0]}, ATOMIC_REQUEST=SELECT TestHanno.testhanno.organisation_id, TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text FROM TestHanno.testhanno})

                     

                     

                     

                     

                    ============================================================================

                    CONVERTING PLAN TREE TO PROCESS TREE

                     

                     

                    PROCESS PLAN =

                    ProjectNode(1) output=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id] [TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id]

                      LimitNode(2) output=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id] limit 100

                        SelectNode(3) output=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id] TestHanno.testhanno.organisation_id IN /*+ DJ */ (SELECT Authorisation_DDC.organization_member.organisation_id FROM Authorisation_DDC.organization_member)

                          AccessNode(4) output=[TestHanno.testhanno.organisation_id, TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text] SELECT g_0.organisation_id, g_0.tenant, g_0.key, g_0.text FROM TestHanno.testhanno AS g_0

                     

                     

                    ============================================================================

                     

                     

                    ----------------------------------------------------------------------------

                    OPTIMIZATION COMPLETE:

                    PROCESSOR PLAN:

                    ProjectNode(1) output=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id] [TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id]

                      LimitNode(2) output=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id] limit 100

                        SelectNode(3) output=[TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text, TestHanno.testhanno.organisation_id] TestHanno.testhanno.organisation_id IN /*+ DJ */ (SELECT Authorisation_DDC.organization_member.organisation_id FROM Authorisation_DDC.organization_member)

                          AccessNode(4) output=[TestHanno.testhanno.organisation_id, TestHanno.testhanno.tenant, TestHanno.testhanno.key, TestHanno.testhanno.text] SELECT g_0.organisation_id, g_0.tenant, g_0.key, g_0.text FROM TestHanno.testhanno AS g_0

                     

                     

                    ============================================================================

                    • 8. Re: fine grained row filters   ( multi tenant access rules )
                      Steven Hawkins Master

                      Thanks Hanno,

                       

                      That makes it clearer.  The issue is that the hint is currently applicable during rewrite, but the inclusion of the row filter is happening later in planning.  It would take an enhancement to use the subquery hint from a security condition.

                       

                      Steve