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

    fine grained row filters   ( multi tenant access rules )

    maanenh58

      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 )
          rareddy

          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 )
            maanenh58

            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

            • 3. Re: fine grained row filters   ( multi tenant access rules )
              rareddy

              Please attach the query plan for the above execution. Query Plans - Teiid 8.10 (draft) - Project Documentation Editor

              • 4. Re: fine grained row filters   ( multi tenant access rules )
                maanenh58

                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 )
                  maanenh58

                  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 )
                    shawkins

                    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 )
                      maanenh58

                      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 )
                        shawkins

                        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