[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference orarep::nomahs::dbintegrator_public_public

Title:DB Integrator Public Conference
Notice:Database Integration - today! Kit/Doc info see note 36
Moderator:BROKE::ABUGOV
Created:Mon Sep 21 1992
Last Modified:Fri Jun 06 1997
Last Successful Update:Fri Jun 06 1997
Number of topics:1171
Total number of notes:5187

1139.0. "DDI interface questions" by NLVMS3::ADRIEL () Fri Mar 28 1997 11:06

    
	Oracle Rdb V6.1A
	Custom Driver gtwy V3.0E
		
	Hi,

	background :

	a customer is looking for a way to combine different datasources
	into a single 'logical' database.
	Datasources are Oracle Rdb databases and a non-relational datasource
	on a Unisys system. 
	To access this last data source customer plans to use Custom Driver 
	gateway.
	DECmessageQ is used to exchange data from/to OpenVMS/Alpha to Unisys
	system. 
	The Cust. Driver gateway will hook into DECmessageQ messages.
	
	Picture:
    
	Rdb applic.--->DBI--->NSDS gtwy--->DMQ msg--->COMS--->DMSII(Unisys).
	
	Problem:

	A certain type of activity (function) at the Unisys side is linked 
	to a DMQ msg type.
	This should be under Rdb application control.

	There are several way to achieve this:

	- define an NSDS table for every DMQ msg type. Gtwy selects a record
          from a table per DMQ msg type.
          Easy to implement but not very SQL like. Lot of tables and lot
	  of WHERE clauses. 

	- combine all DMQ msg types in a single NSDS table. WHERE clause
          determines wich msg type to use.
          Disadvantage: difficult to maintain.

	- a combination of both. Combine certain msg types into one NSDS table.
          This results in less tables.
          WHERE clause determines which msg type to use.
    
	Questions:

	- A multi segment (F1 and F2) key will be defined on the table.
          How does the APS structure look like?. Is there a an APS per
	  segment ?
          In other words is possible to use a WHERE clause like:

          10 <F1 < 20 AND 30 < F2 < 40)     ??

	- Suppose there are 2 multi segment keys defined
          I1 (F1,F2) and I2 (F2,F3)
          The SELECT refers to F1,F2 and F3. 
          Are F1,F2 and F3 defined in APS (SET_ACCESS_PATH) or does 
          NSDS passes only I1 or I2 values ?

	- concept of auxiliary access path is not clear.
          Should that be used in this case ?

	  The point is that for this third option the driver always needs ALL  
          information specified in the query. Not only the fields part of
	  the used index.

	I hope I made myself clear. The customer is currently looking for
        the right strategy to implement. Only source available is the
        Customer Driver Dev. guide. No prototyping done yet.

	As far as I know this will be the first customer overhere using this
	type of 'gateway'. Not much knowledge/experience available.

	Adri van Driel 
T.RTitleUserPersonal
Name
DateLines
1139.1Some info and some pointers...BROKE::WRIGHTNYO&amp;W-Trains Spoken Here-SUSIEQMon Mar 31 1997 15:39102
     <<< NOMAHS::DISK$NOMAHS1:[NOTES$LIBRARY]DBINTEGRATOR_PUBLIC.NOTE;2 >>>
                      -< DB Integrator Public Conference >-
================================================================================
Note 1139.0                  DDI interface questions                  No replies
NLVMS3::ADRIEL                                 74 lines  28-MAR-1997 11:06:27.02
--------------------------------------------------------------------------------

    
	Oracle Rdb V6.1A
	Custom Driver gtwy V3.0E
		
	Hi,

	background :

	a customer is looking for a way to combine different datasources
	into a single 'logical' database.
	Datasources are Oracle Rdb databases and a non-relational datasource
	on a Unisys system. 
	To access this last data source customer plans to use Custom Driver 
	gateway.
	DECmessageQ is used to exchange data from/to OpenVMS/Alpha to Unisys
	system. 
	The Cust. Driver gateway will hook into DECmessageQ messages.
	
	Picture:
    
	Rdb applic.--->DBI--->NSDS gtwy--->DMQ msg--->COMS--->DMSII(Unisys).
	
	Problem:

	A certain type of activity (function) at the Unisys side is linked 
	to a DMQ msg type.
	This should be under Rdb application control.

	There are several way to achieve this:

	- define an NSDS table for every DMQ msg type. Gtwy selects a record
          from a table per DMQ msg type.
          Easy to implement but not very SQL like. Lot of tables and lot
	  of WHERE clauses. 

	- combine all DMQ msg types in a single NSDS table. WHERE clause
          determines wich msg type to use.
          Disadvantage: difficult to maintain.

	- a combination of both. Combine certain msg types into one NSDS table.
          This results in less tables.
          WHERE clause determines which msg type to use.
    
	Questions:

	- A multi segment (F1 and F2) key will be defined on the table.
          How does the APS structure look like?. Is there a an APS per
	  segment ?
>
> I belive there is only one APS per access path even when there are multiple 
> key segments.
>
          In other words is possible to use a WHERE clause like:

          10 <F1 < 20 AND 30 < F2 < 40)     ??
>
> You can certainly use a WHERE clause like this, but only the F1 values would 
> be used for access path purposes.
>
	- Suppose there are 2 multi segment keys defined
          I1 (F1,F2) and I2 (F2,F3)
          The SELECT refers to F1,F2 and F3. 
          Are F1,F2 and F3 defined in APS (SET_ACCESS_PATH) or does 
          NSDS passes only I1 or I2 values ?
>
> No. Only F1 & F2 or F2 & F3 would be defined in the APS for the primary access
> path.See primary vs auxiliary access paths below.
>
	- concept of auxiliary access path is not clear.
          Should that be used in this case ?
>
> For EACH SELECT statement NSDS will select the access path which it's
> optimizer believes is the most efficient. This access path will be the primary 
> access path. (Note-The selection of a primary access path is query dependent.)
>
	  The point is that for this third option the driver always needs ALL  
          information specified in the query. Not only the fields part of
	  the used index.
>
> The driver can request the auxiliary access paths from the engine by setting
> the Auxiliary Access Path capability bit in the Relation Capability Mask as 
> described in the DDI_QUERY_RELATION definition in the Driver Development 
> Guide. You may have to be very generous in your definition of an access path
> to get all the information you want.
>
	I hope I made myself clear. The customer is currently looking for
        the right strategy to implement. Only source available is the
        Customer Driver Dev. guide. No prototyping done yet.
>
> It may help to read sections 4.5.1 & 4.5.2 in the release notes.
>
	As far as I know this will be the first customer overhere using this
	type of 'gateway'. Not much knowledge/experience available.

	Adri van Driel 
1139.2Response to more questions...BROKE::WRIGHTNYO&amp;W-Trains Spoken Here-SUSIEQMon Apr 21 1997 17:1218
Adri,

Here is the response to your offline follow up questions. I am posting it here 
because I think it will be less cumbersome than a series of emails and so that 
anyone with similar questions will be able to reference it.

Table of Contents:

1139.3  General Discussion of Primary and Auxiliary Access Paths
1139.4  How to Run Your Own Tests Using the RMS Gateway
1139.5  A Sample FDL File
1139.6  A Sample CDO File
1139.7  Answers to Specific Questions
1139.8  Specific Test Results

I hope this helps.

					Tom
1139.3General Discussion of Primary and Auxiliary Access PathsBROKE::WRIGHTNYO&amp;W-Trains Spoken Here-SUSIEQMon Apr 21 1997 17:1380
A General Discussion of Primary and Auxiliary Access Paths

Access Path usage is dependent on TWO set of conditions.

  o The indices available in the database

  o The predicates used in the query

For a specific database there exists a set of access paths. This set will 
consist of one access path for each index (key or fast access path to the data) 
available in the database. In general, the access paths of interest for any 
specific query are only those where at least the first segment of the index is 
used in the query predicate.

NSDS access path processing proceeds as follows.

  o The available access paths are examined and the subset of "interesting"
    access paths is determined.

  o The "interesting" access paths are analyzed by the optimizer and based 
    on the information available, the most efficient access path is chosen 
    as the primary access path FOR THAT QUERY. All other "interesting" 
    access paths become auxiliary access paths FOR THAT QUERY.

  o Under "normal" conditions (ie. The primary access path capability bit 
    is ON from the DDI driver and the auxiliary access path capability bit 
    is OFF from the DDI driver.) only the primary access path is passed to the 
    DDI driver.

    o Only rows (records) which satisfy the selection criteria specified for 
      the primary access path are to be passed back to the NSDS engine which 
      assumes the DDI driver has already eliminated any rows which fail to 
      meet any selection criteria imposed by the primary access path.

  o The auxiliary access paths can be made visible to the DDI driver by 
    turning ON the auxiliary access path capability bit. However, this 
    imposes a performance penalty because this will cause the NSDS engine 
    to incure the overhead of building and populating the data structures 
    necessary to pass this information to the DDI driver. When auxiliary 
    access paths have been requested by the DDI driver:

    o Only rows (records) which satisfy the selection criteria specified for
      the primary access path are to be passed back to the NSDS engine which
      assumes the DDI driver has already eliminated any rows which fail to
      meet any selection criteria imposed by the primary access path.
 
    o Auxiliary access paths may be applied at the descretion of the DDI 
      driver for each query. Unlike primary access paths, the NSDS engine 
      makes no assumption that the DDI driver has applied any selection 
      criteria imposed by auxiliary access paths and will check each row 
      returned to verify that it meets any such criteria.

Segmented keys add another level of complexity to access path analysis. With 
regard to segmented keys it is important to remember the following.

  o Key segments are assumed to only useful in a given query when there are no 
    preceeding "holes" in the key. For example, for a key with segments s1 , 
    s2 , and s3, the predicate "where s1 > and and s3 = 5" will cause only 
    segment s1 to be used as part of the access path because the absense of 
    s2 creates a "hole" in front of s3.

  o Access paths where the keys are fully specified will be favored over 
    those whose keys are only partially specified. That is keys where all of 
    the segments are utilized in the query are generally assumed to be 
    make more efficient access paths than those keys where some of the 
    segments are not utilized in the query.

  o Key specifiers are built on a key basis and not a segment basis. Therefore, 
    the nature of the operators in the predicate will influence the 
    usability of key segments in an access path. For example, for a key 
    with segments s1 and s2 the predicate s1 > 5 and s2 = 7 would still 
    only be able to utilize s1 because it is not possible to construct 
    a key specifier with an upper and lower bound which would properly 
    filter the result.

    o It is perhaps worth noting in the example above that if s1 and 
      s2 were seperate KEYS then they would each be access paths and could 
      be made visible to the driver where s2 might be the primary access 
      path and s1 an auxilliary.

1139.4How to Run Your Own Tests Using the RMS GatewayBROKE::WRIGHTNYO&amp;W-Trains Spoken Here-SUSIEQMon Apr 21 1997 17:148
How to Run Your Own Tests Using the RMS Gateway

While the RMS Gateway has no way to utilize auxiliary access paths, it has 
been instrumented to assist in analyzing auxilliary access path behavior. The 
activate this feature define NSDS$DEBUG_FLAGS to be "F" and 
NSDS$_RMS_AUX_AP_TEST to be "TRUE". This will allow you to see both the 
primary and auxiliary access paths passed to the driver for each query.

1139.5A Sample FDL FileBROKE::WRIGHTNYO&amp;W-Trains Spoken Here-SUSIEQMon Apr 21 1997 17:14285
IDENT	" 8-APR-1997 13:07:57	VAX/VMS ANALYZE/RMS_FILE Utility"

SYSTEM
	SOURCE                  VAX/VMS

FILE
	ALLOCATION              48
	BEST_TRY_CONTIGUOUS     no
	BUCKET_SIZE             2
	CLUSTER_SIZE            4
	CONTIGUOUS              no
	EXTENSION               0
	FILE_MONITORING         no
	GLOBAL_BUFFER_COUNT     0
	NAME                    "devname:[directory]adri.dat"
	ORGANIZATION            indexed
	OWNER                   [???,???]
	PROTECTION              (system:RWED, owner:RWED, group:RWED, world:)

RECORD
	BLOCK_SPAN              yes
	CARRIAGE_CONTROL        none
	FORMAT                  fixed
	SIZE                    40

AREA 0
	ALLOCATION              45
	BUCKET_SIZE             2
	EXTENSION               0

KEY 0
	CHANGES                 no
	DATA_KEY_COMPRESSION    no
	DATA_RECORD_COMPRESSION yes
	DATA_AREA               0
	DATA_FILL               100
	DUPLICATES              no
	INDEX_AREA              0
	INDEX_COMPRESSION       no
	INDEX_FILL              100
	LEVEL1_INDEX_AREA       0
	NAME                    "KEY0"
	NULL_KEY                no
	PROLOG                  3
	SEG0_LENGTH             2
	SEG0_POSITION           0
	TYPE                    string

KEY 1
	CHANGES                 no
	DATA_KEY_COMPRESSION    no
	DATA_RECORD_COMPRESSION yes
	DATA_AREA               0
	DATA_FILL               100
	DUPLICATES              no
	INDEX_AREA              0
	INDEX_COMPRESSION       no
	INDEX_FILL              100
	LEVEL1_INDEX_AREA       0
	NAME                    "KEY1"
	NULL_KEY                no
	PROLOG                  3
	SEG0_LENGTH             2
	SEG0_POSITION           2
	TYPE                    string

KEY 2
	CHANGES                 no
	DATA_KEY_COMPRESSION    no
	DATA_RECORD_COMPRESSION yes
	DATA_AREA               0
	DATA_FILL               100
	DUPLICATES              no
	INDEX_AREA              0
	INDEX_COMPRESSION       no
	INDEX_FILL              100
	LEVEL1_INDEX_AREA       0
	NAME                    "KEY2"
	NULL_KEY                no
	PROLOG                  3
	SEG0_LENGTH             2
	SEG0_POSITION           0
	SEG1_LENGTH             2
	SEG1_POSITION           2
	TYPE                    string

KEY 3
	CHANGES                 yes
	DATA_KEY_COMPRESSION    yes
	DATA_AREA               0
	DATA_FILL               100
	DUPLICATES              yes
	INDEX_AREA              0
	INDEX_COMPRESSION       yes
	INDEX_FILL              100
	LEVEL1_INDEX_AREA       0
	NAME                    "KEY3"
	NULL_KEY                no
	SEG0_LENGTH             2
	SEG0_POSITION           4
	TYPE                    string

KEY 4
	CHANGES                 yes
	DATA_KEY_COMPRESSION    yes
	DATA_AREA               0
	DATA_FILL               100
	DUPLICATES              yes
	INDEX_AREA              0
	INDEX_COMPRESSION       yes
	INDEX_FILL              100
	LEVEL1_INDEX_AREA       0
	NAME                    "KEY4"
	NULL_KEY                no
	SEG0_LENGTH             2
	SEG0_POSITION           6
	TYPE                    string

KEY 5
	CHANGES                 yes
	DATA_KEY_COMPRESSION    yes
	DATA_AREA               0
	DATA_FILL               100
	DUPLICATES              yes
	INDEX_AREA              0
	INDEX_COMPRESSION       yes
	INDEX_FILL              100
	LEVEL1_INDEX_AREA       0
	NAME                    "KEY5"
	NULL_KEY                no
	SEG0_LENGTH             2
	SEG0_POSITION           8
	TYPE                    string

KEY 6
	CHANGES                 yes
	DATA_KEY_COMPRESSION    yes
	DATA_AREA               0
	DATA_FILL               100
	DUPLICATES              yes
	INDEX_AREA              0
	INDEX_COMPRESSION       yes
	INDEX_FILL              100
	LEVEL1_INDEX_AREA       0
	NAME                    "KEY6"
	NULL_KEY                no
	SEG0_LENGTH             2
	SEG0_POSITION           4
	SEG1_LENGTH             2
	SEG1_POSITION           6
	TYPE                    string

KEY 7
	CHANGES                 yes
	DATA_KEY_COMPRESSION    yes
	DATA_AREA               0
	DATA_FILL               100
	DUPLICATES              yes
	INDEX_AREA              0
	INDEX_COMPRESSION       yes
	INDEX_FILL              100
	LEVEL1_INDEX_AREA       0
	NAME                    "KEY7"
	NULL_KEY                no
	SEG0_LENGTH             2
	SEG0_POSITION           6
	SEG1_LENGTH             2
	SEG1_POSITION           8
	TYPE                    string

ANALYSIS_OF_AREA 0
	RECLAIMED_SPACE         0

ANALYSIS_OF_KEY 0
	DATA_FILL               87
	DATA_KEY_COMPRESSION    0
	DATA_RECORD_COMPRESSION 32
	DATA_RECORD_COUNT       100
	DATA_SPACE_OCCUPIED     20
	DEPTH                   1
	INDEX_COMPRESSION       0
	INDEX_FILL              8
	INDEX_SPACE_OCCUPIED    2
	LEVEL1_RECORD_COUNT     10
	MEAN_DATA_LENGTH        40
	MEAN_INDEX_LENGTH       2

ANALYSIS_OF_KEY 1
	DATA_FILL               80
	DATA_KEY_COMPRESSION    35
	DATA_RECORD_COUNT       83
	DATA_SPACE_OCCUPIED     4
	DEPTH                   1
	DUPLICATES_PER_SIDR     0
	INDEX_COMPRESSION       46
	INDEX_FILL              3
	INDEX_SPACE_OCCUPIED    2
	LEVEL1_RECORD_COUNT     2
	MEAN_DATA_LENGTH        40
	MEAN_INDEX_LENGTH       2

ANALYSIS_OF_KEY 2
	DATA_FILL               80
	DATA_KEY_COMPRESSION    35
	DATA_RECORD_COUNT       83
	DATA_SPACE_OCCUPIED     4
	DEPTH                   1
	DUPLICATES_PER_SIDR     0
	INDEX_COMPRESSION       46
	INDEX_FILL              3
	INDEX_SPACE_OCCUPIED    2
	LEVEL1_RECORD_COUNT     2
	MEAN_DATA_LENGTH        40
	MEAN_INDEX_LENGTH       4

ANALYSIS_OF_KEY 3
	DATA_FILL               80
	DATA_KEY_COMPRESSION    35
	DATA_RECORD_COUNT       83
	DATA_SPACE_OCCUPIED     4
	DEPTH                   1
	DUPLICATES_PER_SIDR     0
	INDEX_COMPRESSION       46
	INDEX_FILL              3
	INDEX_SPACE_OCCUPIED    2
	LEVEL1_RECORD_COUNT     2
	MEAN_DATA_LENGTH        40
	MEAN_INDEX_LENGTH       2

ANALYSIS_OF_KEY 4
	DATA_FILL               80
	DATA_KEY_COMPRESSION    35
	DATA_RECORD_COUNT       83
	DATA_SPACE_OCCUPIED     4
	DEPTH                   1
	DUPLICATES_PER_SIDR     0
	INDEX_COMPRESSION       46
	INDEX_FILL              3
	INDEX_SPACE_OCCUPIED    2
	LEVEL1_RECORD_COUNT     2
	MEAN_DATA_LENGTH        40
	MEAN_INDEX_LENGTH       2

ANALYSIS_OF_KEY 5
	DATA_FILL               80
	DATA_KEY_COMPRESSION    35
	DATA_RECORD_COUNT       83
	DATA_SPACE_OCCUPIED     4
	DEPTH                   1
	DUPLICATES_PER_SIDR     0
	INDEX_COMPRESSION       46
	INDEX_FILL              3
	INDEX_SPACE_OCCUPIED    2
	LEVEL1_RECORD_COUNT     2
	MEAN_DATA_LENGTH        40
	MEAN_INDEX_LENGTH       2

ANALYSIS_OF_KEY 6
	DATA_FILL               80
	DATA_KEY_COMPRESSION    35
	DATA_RECORD_COUNT       83
	DATA_SPACE_OCCUPIED     4
	DEPTH                   1
	DUPLICATES_PER_SIDR     0
	INDEX_COMPRESSION       46
	INDEX_FILL              3
	INDEX_SPACE_OCCUPIED    2
	LEVEL1_RECORD_COUNT     2
	MEAN_DATA_LENGTH        40
	MEAN_INDEX_LENGTH       4

ANALYSIS_OF_KEY 7
	DATA_FILL               80
	DATA_KEY_COMPRESSION    35
	DATA_RECORD_COUNT       83
	DATA_SPACE_OCCUPIED     4
	DEPTH                   1
	DUPLICATES_PER_SIDR     0
	INDEX_COMPRESSION       46
	INDEX_FILL              3
	INDEX_SPACE_OCCUPIED    2
	LEVEL1_RECORD_COUNT     2
	MEAN_DATA_LENGTH        40
	MEAN_INDEX_LENGTH       4

1139.6A Sample CDO FileBROKE::WRIGHTNYO&amp;W-Trains Spoken Here-SUSIEQMon Apr 21 1997 17:1592
!!!!! CDO Definition
!
! This file provides CDO metadata for tests required to analyze conditions
! as requested by Adri van Driel on behalf of a potential Custom Driver 
! customer in.
!

set verify

define field f1
   datatype is text
   size is 2 characters.

define field f2
   datatype is text
   size is 2 characters.

define field f3
   datatype is text
   size is 2 characters.

define field f4
   datatype is text
   size is 2 characters.

define field f5
   datatype is text
   size is 2 characters.

define field f6
   datatype is text
   size is 30 characters.

!============================================================================

define record r1.
 
    f1.
    f2.
    f3.
    f4.
    f5.
    f6.
end r1 record.


!===========================================================================

define rms_database  adri_rms.
        record r1.

        file_definition
                organization indexed.
        keys.
           key 0
                segment f1 in r1.
           key 1
                segment f2 in r1.
           key 2
                segment f1 in r1
                segment f2 in r1.
           key 3
                changes
                duplicates
                segment f3 in r1.
           key 4
                changes
                duplicates
                segment f4 in r1.
           key 5
                changes
                duplicates
                segment f5 in r1.
           key 6
                changes
                duplicates
                segment f3 in r1
                segment f4 in r1.
           key 7
                changes
                duplicates
                segment f4 in r1
                segment f5 in r1.
        end.
end.

!===========================================================================

define database adri_db
 using adri_rms
     on devname:[directory]adri.dat.

1139.7Answers to Specific QuestionsBROKE::WRIGHTNYO&amp;W-Trains Spoken Here-SUSIEQMon Apr 21 1997 17:16333
Answers to Specific Questions

  Key:  "-"     = Original Questions
        ">"     = Responses to Original Questions
        "*NEW*" = Second Round of Questions
	">>"    = Responses to Second Round Questions

- A multi segment (F1 and F2) key will be defined on the table. 
- How does the APS structure look like?. Is there a an APS per  
segment ?  
>  
> I believe there is only one APS per access path even when there are  
> multiple key segments.  
>  
 
- In other words is possible to use a WHERE clause like: 
-    (10 <F1 < 20 AND 30 < F2 < 40)     ??  
 
>  
> You can certainly use a WHERE clause like this, but only  
> the F1 values would be used for access path purposes.  
> *(1)* 
 
*NEW*   Will the DDI_SET_ACCESS_PATH call look like this ? 
*NEW*    (assuming F1 and F2 are two 32-bit integers 
*NEW*     with F1 starting at offset 6) 
*NEW*   ..., 
*NEW*   apply_primary_access_path := TRUE 
*NEW*   apply_auxiliary_access_path := FALSE 
*NEW*   primary_access_path := *path --------+ 
*NEW*   auxiliary_access_path_list := nil    | 
*NEW*                                        | 
*NEW*   +------------------------------------+ 
*NEW*   | 
*NEW*   v 
*NEW*   nsdsaps$a_next_ptr := nil 
*NEW*   nsdsaps$a_key_name := IF1F2 
*NEW*   nsdsaps$l_key_offset := 6 
*NEW*   nsdsaps$l_key_size := 8 
*NEW*   nsdsaps$l_key_ptr := *kse -----------+ 
*NEW*                                        | 
*NEW*   +------------------------------------+ 
*NEW*   | 
*NEW*   v 
*NEW*   nsdskse$a_next_ptr := nil 
*NEW*   nsdskse$l_lb_operator := NSDS$K_GTR 
*NEW*   nsdskse$l_lb_compare_size := 4 
*NEW*   nsdskse$l_lb_compare_ptr := *value --> 10 
*NEW*   nsdskse$l_ub_operator := NSDS$K_LSS 
*NEW*   nsdskse$l_ub_compare_size := 4 
*NEW*   nsdskse$l_ub_compare_ptr := *value --> 20 
*NEW*   nsdskse$l_ub_selection_id := id 
>>
>> I believe this is correct.
>>
*NEW*   Will this also be the case if auxiliary paths 
*NEW*   are enabled ? 
>>
>> Yes. Enabling auxiliary access paths should not influence the primary
>> access path.
>>
*NEW*   Will F1 be chosen to be the primary path and 
*NEW*   F2 the auxiliary path ? Or will F2 not be  
*NEW*   mentioned in any path ? 
>>
>> Given the available information it is essentially a toss up between F1 and 
>> F2 as to which would be the most efficient access path and all other things 
>> being equal I believe they would cost out the same. Therefore, I can't 
>> state conclusively that F1 would be the primary access path. However, if 
>> F1 is chosen as the primary access path then F2 should be the auxiliary. 
>> Similarly, if F2 is chosen as the primary then F1 should be the auxiliary.
>> 
*NEW*   What happens if query is something like: 
*NEW*      WHERE F1 = 10 AND 30<F2<40 
*NEW*   Will: F1 be primary and F2 auxiliary ? 
*NEW*     or: F1||F2 be primary  
*NEW*     or: F1 be primary and F2 not mentioned ?              
>>
>> It makes a big difference whether F1 and F2 are seperate keys are multiple 
>> segments of the same key. Assuming the following.
>>
>>   o F1 and F2 are seperate keys.
>>   o F1 and F2 are unique keys. (ie. Duplicate values are NOT allowed.)
>>   o Auxiliary access paths are enabled by the DDI driver.
>>
>> F1 will be chosen as the primary access paths as equality costs better 
>> than inequality.
>>
>> F1 || F2 is not an option unless they are multiple segments of a single key.
>>
>> F2 would be an auxiliary key visable to the DDI driver.
>>
>> Note: Additional tests based on different assumptions can be conducted by 
>> refering to note 1139.4.
>>
*NEW*   Will the DDI_SET_ACCESS_PATH call look like this ? 
*NEW*    (assuming F1 and F2 are two 32-bit integers 
*NEW*     with F1 starting at offset 6) 
*NEW*   ..., 
*NEW*   apply_primary_access_path := TRUE 
*NEW*   apply_auxiliary_access_path := FALSE 
*NEW*   primary_access_path := *path --------+ 
*NEW*   auxiliary_access_path_list := nil    | 
*NEW*                                        | 
*NEW*   +------------------------------------+ 
*NEW*   | 
*NEW*   v 
*NEW*   nsdsaps$a_next_ptr := nil 
*NEW*   nsdsaps$a_key_name := IF1F2 
*NEW*   nsdsaps$l_key_offset := 6 
*NEW*   nsdsaps$l_key_size := 8 
*NEW*   nsdsaps$l_key_ptr := *kse -----------+ 
*NEW*                                        | 
*NEW*   +------------------------------------+ 
*NEW*   | 
*NEW*   v 
*NEW*   nsdskse$a_next_ptr := nil 
*NEW*   nsdskse$l_lb_operator := NSDS$K_GTR 
*NEW*   nsdskse$l_lb_compare_size := 8 
*NEW*   nsdskse$l_lb_compare_ptr := *value --> 10||30 
*NEW*   nsdskse$l_ub_operator := NSDS$K_LSS 
*NEW*   nsdskse$l_ub_compare_size := 8 
*NEW*   nsdskse$l_ub_compare_ptr := *value --> 10||40 
*NEW*   nsdskse$l_ub_selection_id := id 
>>
>> I don't believe so. Refer to the previous answer.
>>
>> Also I doubt you can concatenate integers. I believe these have to be 
>> text values in order to allow concatination.
>>
*NEW*   What if: 
*NEW*      WHERE F1 IN (10, 20) AND 30<F2<40 
 
*NEW*   Will the DDI_SET_ACCESS_PATH call look like this ? 
*NEW*    (assuming F1 and F2 are two 32-bit integers 
*NEW*     with F1 starting at offset 6) 
*NEW*   ..., 
*NEW*   apply_primary_access_path := TRUE 
*NEW*   apply_auxiliary_access_path := FALSE 
*NEW*   primary_access_path := *path --------+ 
*NEW*   auxiliary_access_path_list := nil    | 
*NEW*                                        | 
*NEW*   +------------------------------------+ 
*NEW*   | 
*NEW*   v 
*NEW*   nsdsaps$a_next_ptr := nil 
*NEW*   nsdsaps$a_key_name := IF1F2 
*NEW*   nsdsaps$l_key_offset := 6 
*NEW*   nsdsaps$l_key_size := 8 
*NEW*   nsdsaps$l_key_ptr := *kse -----------+ 
*NEW*                                        | 
*NEW*   +------------------------------------+ 
*NEW*   | 
*NEW*   v 
*NEW*   nsdskse$a_next_ptr := *nextkse ----------------+ 
*NEW*   nsdskse$l_lb_operator := NSDS$K_GTR            | 
*NEW*   nsdskse$l_lb_compare_size := 8                 | 
*NEW*   nsdskse$l_lb_compare_ptr := *value --> 10||30  | 
*NEW*   nsdskse$l_ub_operator := NSDS$K_LSS            | 
*NEW*   nsdskse$l_ub_compare_size := 8                 | 
*NEW*   nsdskse$l_ub_compare_ptr := *value --> 10||40  | 
*NEW*   nsdskse$l_ub_selection_id := id                | 
*NEW*                                                  | 
*NEW*   +----------------------------------------------+ 
*NEW*   | 
*NEW*   v 
*NEW*   nsdskse$a_next_ptr := nil 
*NEW*   nsdskse$l_lb_operator := NSDS$K_GTR 
*NEW*   nsdskse$l_lb_compare_size := 8 
*NEW*   nsdskse$l_lb_compare_ptr := *value --> 20||30 
*NEW*   nsdskse$l_ub_operator := NSDS$K_LSS 
*NEW*   nsdskse$l_ub_compare_size := 8 
*NEW*   nsdskse$l_ub_compare_ptr := *value --> 20||40 
*NEW*   nsdskse$l_ub_selection_id := id 
>>
>> No. I believe you would have a primary access paths based on F1 and an 
>> auxiliary path based on F2. It should look something like:
>>
>>   APS: Primary: Key: F1     Offset: 6     Size: 4
>>
>>     KSE: Lower Bound:
>>            Operator: EQUAL TO
>>            Offset:   6
>>            Size:     4
>>            Value:    10
>>          Upper Bound:
>>            Operator: EQUAL TO
>>            Offset:   6
>>            Size:     4
>>            Value:    20
>>
>>   APS: Auxiliary: Key: F2     Offset: ?     Size: 4
>>
>>     KSE: Lower Bound:
>>            Operator: GREATER THAN
>>            Offset:   ?
>>            Size:     4
>>            Value:    30
>>          Upper Bound:
>>            Operator: LESS THAN
>>            Offset:   ?
>>            Size:     4
>>            Value:    40
>>
- Suppose there are 2 multi segment keys defined I1 (F1,F2)  
- and I2 (F2,F3)  
- The SELECT refers to F1,F2 and F3.   
- Are F1,F2 and F3 defined in APS (SET_ACCESS_PATH) or does  
- NSDS passes only I1 or I2 values ?  
 
>  
> No. Only F1 & F2 or F2 & F3 would be defined in the APS for the  
primary  
> access path.See primary vs auxiliary access paths below.  
> *(2)* 
 
 
*NEW*   So if we combine *(1)* and *(2)*, only F1 will be used 
*NEW*   in case of F1&F2 or F2 in case of F2&F3 ? 
>>
>> I believe that this is true as there would be an access path for I1 and 
>> another access path for I2, but in neither case is the second field usable 
>> in the specified query.
>>
*NEW*   Or is it dependent on the operator that specifies F1  
*NEW*   (with F1&F2) or F2 (F2&F3) so '=' means that also the  
*NEW*   second segment will be used and all other operators leave 
*NEW*   the second segment useless ?
>>
>> I believe this is true.
>> 
*NEW*   Could this work if F1 and F2 are incompatible 
*NEW*   (e.g. if a single binary comparison of two concatenated  
*NEW*   fields with the keyvalue does not yield the correct result) ? 
>>
>> No. Note my comment above regarding concatination.
>>
*NEW*   What happens if auxiliary paths are enabled ? 
*NEW*   - F1 as primary path and F2 as auxiliary path or 
*NEW*   - F2 as primary path and F3 as auxiliary path or will also be possible 
*NEW*   - F1 as primary, F2 and F3 as auxiliary paths ? 
>>
>> This is confused. You stated that F1 , F2 , F3 , and F4 were segments of 
>> keys I1 and I2. Access paths are keys specific not segment specific.
>> 
*NEW*   What if my SELECT refers to F1 and F2 and F3 and auxiliary 
*NEW*   paths are enabled. Will it make any difference in (APS) 
*NEW*   (primary and/or auxiliary) if I make three indexes each 
*NEW*   using one field (i.e. not segmented) or making one index  
*NEW*   with all fields (i.e. segmented) ? 
>>
>> Absolutely.
>> 
- concept of auxiliary access path is not clear.  
- Should that be used in this case ?  
 
>  
> For EACH SELECT statement NSDS will select the access path which  
it's  
> optimizer believes is the most efficient. This access path will be  
the   
>  primary access path. (Note-The selection of a primary access path  
is  
>  query dependent.)  
>  
 
- The point is that for this third option the driver always needs  
- ALL   information specified in the query. Not only the fields part  
of  
- the used index.  
 
>  
> The driver can request the auxiliary access paths from the engine  
by  
>  setting the Auxiliary Access Path capability bit in the Relation  
>  Capability Mask as described in the DDI_QUERY_RELATION definition  
in the  
>      Driver Development   
> Guide. You may have to be very generous in your definition of an  
access  
>  path to get all the information you want.  
 
 
*NEW*   If I'm being generous - i.e. specifying an access-path for 
*NEW*   each and every column that will ever be used in a predicate - 
*NEW*   can I be sure (garanteed) that the auxiliary paths 
*NEW*   will state all the predicates in my SQL ? 
>>
>> I believe so.
>>
*NEW*   If I don't alter my SQL-query nor my access path definition  
*NEW*   given by DDI_QUERY_RELATION, will the primary&auxiliary paths 
*NEW*   (fields in the APS + fieldoperators in the KSE) always remain   
*NEW*   the same each time the query is executed? Or might the access path 
*NEW*   strategy be adapted due to statistical information about query  
*NEW*   responsetimes? 
>>
>> I believe this is essentially true although very low cardinalities might 
>> cause indices (and therefore access paths) not to be used at all.
>>
*NEW*   Section 4.3 Access Paths in the release notes reads: 
*NEW*   "Only one access path may originate at a given record offset" 
*NEW*   Section 2.12 for the RMS-driver states that this driver 
*NEW*   can distinguish multiple indexes starting at the same offset 
*NEW*   if I use unique indexnames. 
*NEW*   If every segmented key in the custom driver has an unique 
*NEW*   name (access_path_name_dsc in DDI access Path Callback 
*NEW*   function), it should be possible to differenciate indexes 
*NEW*   by name (nsdsaps$a_key_name in APS) even if they originate 
*NEW*   at the same offset ?
>>
>> I don't see these references in my copy of the Release Notes, however, 
>> the second statement, which says "it should be possible to differenciate 
>> indexes by name" is correct.
>>
*NEW*   Developer Guide states for DDI_SET_ACCESS_PATH routine: 
*NEW*   "The compare size may be less than the key field size" 
*NEW*   What is 'the key field size' when using segmented index ? 
*NEW*   Is it the total length of all fields that make out the index ?
>>
>> Yes. I believe that the total length is the sum of the lengths of the 
>> segments. In fact, the costing algorithm takes into account whether 
>> and multi segmented key is fully specified or not.
>> 
*NEW*   Developer Guide states for DDI_SET_ACCESS_PATH routine: 
*NEW*   "The key value is always in the same datatype as the key field" 
*NEW*   What is 'same datatype' when using segmented index ? 
*NEW*   Is it the binary concatenation of all segments ? 
>>
>> I believe there are very strict limits on the ability to concatinate 
>> segments with regards to datatype. To begin with, I believe that anything 
>> which would mess up the "normal" sort sequence is not allowed.
>>
1139.8Test ResultsBROKE::WRIGHTNYO&amp;W-Trains Spoken Here-SUSIEQMon Apr 21 1997 17:161438
$ ! 
$ show logical nsds$debug_flags
   "NSDS$DEBUG_FLAGS" = "F" (LNM$JOB_83DB4450)
$ show logical nsds$_bypass_journaling
   "NSDS$_BYPASS_JOURNALING" = "TRUE" (LNM$JOB_83DB4450)
$ show logical nsds$_rms_aux_ap_test
   "NSDS$_RMS_AUX_AP_TEST" = "TRUE" (LNM$JOB_83DB4450)
$ sql
show version ;
Current version of SQL is: VAX SQL V4.1-0
@adri
SQL> set verify
SQL> attach 'f /type=nsds/path=adri.cdo/dict=nsds$mdi_cdo_reader_shr.exe' ;
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_INI
  Driver Initialization Information:
    Driver Name    NSDS RMS Data Driver
    Driver Version V3.0E-1
    DDI Protocol   V2.1-2
    Negotiated Capability Mask: 0001, Engine Mask: 0001
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_ATTACH_DATABASE
RMS DDI:  Dbkey scope:  TRANSACTION
SQL> show table ADRI_DB ;
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_START_TRANSACTION
RMS DDI:  Access is READ ONLY
RMS DDI:  Wait time 5
*** RMS data driver: VMS version 'V5.5-2  ', major=5, minor=5
Information for table ADRI_DB
 
Columns for table ADRI_DB:
Column Name			Data Type	 Domain
-----------			---------	 ------
F1                              CHAR(2) 	 F1
 Query Header:	F1
F2                              CHAR(2) 	 F2
 Query Header:	F2
F3                              CHAR(2) 	 F3
 Query Header:	F3
F4                              CHAR(2) 	 F4
 Query Header:	F4
F5                              CHAR(2) 	 F5
 Query Header:	F5
F6                              CHAR(30) 	 F6
 Query Header:	F6
 
Constraints referencing table ADRI_DB:
No constraints found
 
Indexes on table ADRI_DB:
ADRI_RMS$0                      with column F1
				no duplicates allowed
				type is sorted
 
ADRI_RMS$1                      with column F2
				no duplicates allowed
				type is sorted
 
ADRI_RMS$2                      with column F1
				and column F2
				no duplicates allowed
				type is sorted
 
ADRI_RMS$3                      with column F3
				duplicates are allowed
				type is sorted
 
ADRI_RMS$4                      with column F4
				duplicates are allowed
				type is sorted
 
ADRI_RMS$5                      with column F5
				duplicates are allowed
				type is sorted
 
ADRI_RMS$6                      with column F3
				and column F4
				duplicates are allowed
				type is sorted
 
ADRI_RMS$7                      with column F4
				and column F5
				duplicates are allowed
				type is sorted
 
Triggers on table ADRI_DB:
No triggers found
 
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_ROLLBACK_TRANSACTION
RMS DDI: Call to DDI function
RMS DDI: cleanup_xact
SQL> select * from ADRI_DB ;
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_START_TRANSACTION
RMS DDI:  Access is READ ONLY
RMS DDI:  Wait time 5
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_QUERY_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Opening relation READ ONLY
RMS DDI: Call to RMS service
RMS DDI: SYS$OPEN
RMS DDI: Journaling is not active
RMS DDI: File access = 02 ( GET )
RMS DDI: File sharing options = 0F ( SHRPUT SHRGET SHRDEL SHRUPD )
RMS DDI: Call to RMS service
RMS DDI: SYS$CLOSE (re-open for indexed file)
RMS DDI: Call to RMS service
RMS DDI: SYS$OPEN (indexed file)
RMS DDI: Creating new FIT db: 4DFC60, database 28BC00
RMS DDI: Creating new FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT db:  4DFC60, FIT file:  4DFC00, FAB:  4DE800
RMS DDI: FIT db:  4DFC60, FIT file entries are:
		 FIT file:  4DFC00 = ADRI_DB
RMS DDI: Record lock option = 02020000 ( TMO WAT )
RMS DDI: Call to RMS service
RMS DDI: SYS$CONNECT
RMS DDI: Connecting RAB to FAB relation ADRI_DB, database 28BC00
RMS DDI: FAB:  4DE800, RAB:  4DEFF0
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: This is a local file
RMS DDI: Call to DDI function
RMS DDI: Close RMS file
RMS DDI: Close for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DFC00, FAB:  4DE800
RMS DDI: Disconnecting record stream
RMS DDI: Call to RMS service
RMS DDI: SYS$DISCONNECT
RMS DDI: Call to RMS service
RMS DDI: SYS$CLOSE
RMS DDI: Releasing FIT db: 4DFC60, database 28BC00
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_OPEN_DATA_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Opening relation READ ONLY
RMS DDI: Call to RMS service
RMS DDI: SYS$OPEN
RMS DDI: Journaling is not active
RMS DDI: File access = 02 ( GET )
RMS DDI: File sharing options = 0F ( SHRPUT SHRGET SHRDEL SHRUPD )
RMS DDI: Call to RMS service
RMS DDI: SYS$CLOSE (re-open for indexed file)
RMS DDI: Call to RMS service
RMS DDI: SYS$OPEN (indexed file)
RMS DDI: Creating new FIT db: 4DAC60, database 28BC00
RMS DDI: Creating new FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT db:  4DAC60, FIT file:  4DAC00, FAB:  4D5C00
RMS DDI: FIT db:  4DAC60, FIT file entries are:
		 FIT file:  4DAC00 = ADRI_DB
RMS DDI: Record lock option = 02120000 ( NLK TMO WAT )
RMS DDI: Call to RMS service
RMS DDI: SYS$CONNECT
RMS DDI: Connecting RAB to FAB relation ADRI_DB, database 28BC00
RMS DDI: FAB:  4D5C00, RAB:  4D63F0
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_ALLOCATE_METADATA_MEM
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_RECEIVE_METADATA_INFO
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_ACCESS_PATH
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_DATA_SELECTION
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple first call
RMS DDI: Call to RMS service
RMS DDI: SYS$REWIND
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
 F1     F2     F3     F4     F5     F6                               
 11     21     31     41     51     record b                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
 12     22     32     42     52     record c                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
 13     23     33     43     53     record d                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
 14     24     34     44     54     record e                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
 15     25     35     45     55     record f                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
 16     26     36     46     56     record g                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
 17     27     37     47     57     record h                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
 18     28     38     48     58     record i                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: End of data
RMS DDI: 9 records read
%RMS-E-EOF, end of file detected
 19     29     39     49     59     record j                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_CLOSE_DATA_RELATION
9 rows selected
SQL> !
SQL> !----- f1 & f2 w/ k0 , k1 , & k3
SQL> !      where k0 = f0
SQL> !            k1 = f1
SQL> !            k2 = f0 + f1
SQL> !
SQL> select * from ADRI_DB
cont>   where '13' < f1
cont>     and   f1 < '17'
cont>     and '23' < f2
cont>     and   f2 < '27' ;
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_QUERY_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Reusing FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: This is a local file
RMS DDI: Call to DDI function
RMS DDI: Close RMS file
RMS DDI: Close for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI: Decrementing stream count:  1
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_OPEN_DATA_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Reusing FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_ALLOCATE_METADATA_MEM
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_RECEIVE_METADATA_INFO
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_ACCESS_PATH

Primary Access path Key offset, size: 0, 2
Access path Key name: KEY0                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: GREATER THAN
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003331"
              Value (ascii):       "13"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: LESS THAN
          Upper Bound Selection Eval callback ID:  004edc00
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003731"
              Value (ascii):       "17"
              Value (ebcdic):      "\ "

Auxiliary Access path Key offset, size: 2, 2
Access path Key name: KEY1                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: GREATER THAN
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003332"
              Value (ascii):       "23"
              Value (ebcdic):      " \"
      Upper bound
          Operator type: LESS THAN
          Upper Bound Selection Eval callback ID:  004f9c00
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003732"
              Value (ascii):       "27"
              Value (ebcdic):      "  "

Auxiliary Access path Key offset, size: 0, 2
Access path Key name: KEY2                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: GREATER THAN
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003331"
              Value (ascii):       "13"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: LESS THAN
          Upper Bound Selection Eval callback ID:  004f1c00
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003731"
              Value (ascii):       "17"
              Value (ebcdic):      "\ "
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_DATA_SELECTION
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple first call
RMS DDI: Call to DDI function
RMS DDI: Begin first key specifier pass
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
 F1     F2     F3     F4     F5     F6                               
 14     24     34     44     54     record e                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
 15     25     35     45     55     record f                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: End of data
RMS DDI: 3 records read
%RMS-S-NORMAL, normal successful completion
 16     26     36     46     56     record g                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_CLOSE_DATA_RELATION
3 rows selected
SQL> select * from ADRI_DB
cont>   where '15' = f1
cont>     and '23' < f2
cont>     and   f2 < '27' ;
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_QUERY_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Reusing FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: This is a local file
RMS DDI: Call to DDI function
RMS DDI: Close RMS file
RMS DDI: Close for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI: Decrementing stream count:  2
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_OPEN_DATA_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Reusing FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_ALLOCATE_METADATA_MEM
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_RECEIVE_METADATA_INFO
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_ACCESS_PATH

Primary Access path Key offset, size: 0, 2
Access path Key name: KEY0                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: EQUAL TO
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003531"
              Value (ascii):       "15"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  004ea000
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003531"
              Value (ascii):       "15"
              Value (ebcdic):      "\\"

Auxiliary Access path Key offset, size: 2, 2
Access path Key name: KEY1                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: GREATER THAN
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003332"
              Value (ascii):       "23"
              Value (ebcdic):      " \"
      Upper bound
          Operator type: LESS THAN
          Upper Bound Selection Eval callback ID:  00612600
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003732"
              Value (ascii):       "27"
              Value (ebcdic):      "  "

Auxiliary Access path Key offset, size: 0, 2
Access path Key name: KEY2                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: EQUAL TO
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003531"
              Value (ascii):       "15"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  004edc00
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003531"
              Value (ascii):       "15"
              Value (ebcdic):      "\\"
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_DATA_SELECTION
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple first call
RMS DDI: Call to DDI function
RMS DDI: Begin first key specifier pass
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Begin next key specifier pass
RMS DDI: End of data
RMS DDI: 1 records read
%RMS-S-NORMAL, normal successful completion
 F1     F2     F3     F4     F5     F6                               
 15     25     35     45     55     record f                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_CLOSE_DATA_RELATION
1 row selected
SQL> select * from ADRI_DB
cont>   where f1 in ( '14' , '16' )
cont>     and '23' <  f2
cont>     and   f2 <  '27' ;
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_QUERY_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Reusing FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: This is a local file
RMS DDI: Call to DDI function
RMS DDI: Close RMS file
RMS DDI: Close for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI: Decrementing stream count:  3
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_OPEN_DATA_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Reusing FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_ALLOCATE_METADATA_MEM
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_RECEIVE_METADATA_INFO
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_ACCESS_PATH

Primary Access path Key offset, size: 0, 2
Access path Key name: KEY0                            
RMS DDI: #key specifiers: 2

         Key #1
      Lower bound
          Operator type: EQUAL TO
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003431"
              Value (ascii):       "14"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  00614200
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003431"
              Value (ascii):       "14"
              Value (ebcdic):      "\\"

         Key #2
      Lower bound
          Operator type: EQUAL TO
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003631"
              Value (ascii):       "16"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  00614e00
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003631"
              Value (ascii):       "16"
              Value (ebcdic):      "\\"

Auxiliary Access path Key offset, size: 2, 2
Access path Key name: KEY1                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: GREATER THAN
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003332"
              Value (ascii):       "23"
              Value (ebcdic):      " \"
      Upper bound
          Operator type: LESS THAN
          Upper Bound Selection Eval callback ID:  0061a200
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003732"
              Value (ascii):       "27"
              Value (ebcdic):      "  "

Auxiliary Access path Key offset, size: 0, 2
Access path Key name: KEY2                            
RMS DDI: #key specifiers: 2

         Key #1
      Lower bound
          Operator type: EQUAL TO
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003431"
              Value (ascii):       "14"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  00615200
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003431"
              Value (ascii):       "14"
              Value (ebcdic):      "\\"

         Key #2
      Lower bound
          Operator type: EQUAL TO
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003631"
              Value (ascii):       "16"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  00616e00
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003631"
              Value (ascii):       "16"
              Value (ebcdic):      "\\"
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_DATA_SELECTION
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple first call
RMS DDI: Call to DDI function
RMS DDI: Begin first key specifier pass
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Begin next key specifier pass
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
 F1     F2     F3     F4     F5     F6                               
 14     24     34     44     54     record e                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Begin next key specifier pass
RMS DDI: End of data
RMS DDI: 2 records read
%RMS-S-NORMAL, normal successful completion
 16     26     36     46     56     record g                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_CLOSE_DATA_RELATION
2 rows selected
SQL> select * from ADRI_DB
cont>   where ( f1 = '14' or f1 = '16' )
cont>     and '23' <  f2
cont>     and   f2 <  '27' ;
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_QUERY_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Reusing FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: This is a local file
RMS DDI: Call to DDI function
RMS DDI: Close RMS file
RMS DDI: Close for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI: Decrementing stream count:  4
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_OPEN_DATA_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Reusing FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_ALLOCATE_METADATA_MEM
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_RECEIVE_METADATA_INFO
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_ACCESS_PATH

Primary Access path Key offset, size: 0, 2
Access path Key name: KEY0                            
RMS DDI: #key specifiers: 2

         Key #1
      Lower bound
          Operator type: EQUAL TO
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003431"
              Value (ascii):       "14"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  00614200
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003431"
              Value (ascii):       "14"
              Value (ebcdic):      "\\"

         Key #2
      Lower bound
          Operator type: EQUAL TO
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003631"
              Value (ascii):       "16"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  00614e00
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003631"
              Value (ascii):       "16"
              Value (ebcdic):      "\\"

Auxiliary Access path Key offset, size: 2, 2
Access path Key name: KEY1                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: GREATER THAN
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003332"
              Value (ascii):       "23"
              Value (ebcdic):      " \"
      Upper bound
          Operator type: LESS THAN
          Upper Bound Selection Eval callback ID:  0061a600
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003732"
              Value (ascii):       "27"
              Value (ebcdic):      "  "

Auxiliary Access path Key offset, size: 0, 2
Access path Key name: KEY2                            
RMS DDI: #key specifiers: 2

         Key #1
      Lower bound
          Operator type: EQUAL TO
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003431"
              Value (ascii):       "14"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  00617a00
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003431"
              Value (ascii):       "14"
              Value (ebcdic):      "\\"

         Key #2
      Lower bound
          Operator type: EQUAL TO
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003631"
              Value (ascii):       "16"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  00617e00
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003631"
              Value (ascii):       "16"
              Value (ebcdic):      "\\"
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_DATA_SELECTION
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple first call
RMS DDI: Call to DDI function
RMS DDI: Begin first key specifier pass
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Begin next key specifier pass
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
 F1     F2     F3     F4     F5     F6                               
 14     24     34     44     54     record e                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Begin next key specifier pass
RMS DDI: End of data
RMS DDI: 2 records read
%RMS-S-NORMAL, normal successful completion
 16     26     36     46     56     record g                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_CLOSE_DATA_RELATION
2 rows selected
SQL> !
SQL> !----- f3 , f4 , & , f5 w/ k3 , k4 , k5 , k6 , & k7
SQL> !      where k3 = f3
SQL> !            k4 = f4
SQL> !            k5 = f5
SQL> !            k6 = k3 + k4
SQL> !            k7 = k4 + k5
SQL> ! 
SQL> select * from ADRI_DB
cont>   where '35' = f3
cont>     and '45' = f4 ;
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_QUERY_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Reusing FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: This is a local file
RMS DDI: Call to DDI function
RMS DDI: Close RMS file
RMS DDI: Close for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI: Decrementing stream count:  5
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_OPEN_DATA_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Reusing FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_ALLOCATE_METADATA_MEM
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_RECEIVE_METADATA_INFO
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_ACCESS_PATH

Primary Access path Key offset, size: 4, 2
Access path Key name: KEY6                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: EQUAL TO
          Value size: 4
            Offset (within key):   0
              Value (hex):         "35343533"
              Value (ascii):       "3545"
              Value (ebcdic):      "\\\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  004e7c00
          Value size: 4
            Offset (within key):   0
              Value (hex):         "35343533"
              Value (ascii):       "3545"
              Value (ebcdic):      "\\\\"

Auxiliary Access path Key offset, size: 6, 2
Access path Key name: KEY4                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: EQUAL TO
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003534"
              Value (ascii):       "45"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  00613200
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003534"
              Value (ascii):       "45"
              Value (ebcdic):      "\\"

Auxiliary Access path Key offset, size: 6, 2
Access path Key name: KEY7                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: EQUAL TO
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003534"
              Value (ascii):       "45"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  00611a00
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003534"
              Value (ascii):       "45"
              Value (ebcdic):      "\\"

Auxiliary Access path Key offset, size: 4, 2
Access path Key name: KEY3                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: EQUAL TO
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003533"
              Value (ascii):       "35"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  004ea000
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003533"
              Value (ascii):       "35"
              Value (ebcdic):      "\\"
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_DATA_SELECTION
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple first call
RMS DDI: Call to DDI function
RMS DDI: Begin first key specifier pass
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: End of data
RMS DDI: 1 records read
%RMS-S-OK_LIM, retrieved record exceeds specified key value
 F1     F2     F3     F4     F5     F6                               
 15     25     35     45     55     record f                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_CLOSE_DATA_RELATION
1 row selected
SQL> select * from ADRI_DB
cont>   where '33' < f3
cont>     and   f3 < '37'
cont>     and '45' = f4 ;
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_QUERY_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Reusing FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: This is a local file
RMS DDI: Call to DDI function
RMS DDI: Close RMS file
RMS DDI: Close for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI: Decrementing stream count:  6
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_OPEN_DATA_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Reusing FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_ALLOCATE_METADATA_MEM
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_RECEIVE_METADATA_INFO
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_ACCESS_PATH

Primary Access path Key offset, size: 4, 2
Access path Key name: KEY6                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: GREATER THAN
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003333"
              Value (ascii):       "33"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: LESS THAN
          Upper Bound Selection Eval callback ID:  00611600
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003733"
              Value (ascii):       "37"
              Value (ebcdic):      "\ "

Auxiliary Access path Key offset, size: 6, 2
Access path Key name: KEY4                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: EQUAL TO
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003534"
              Value (ascii):       "45"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  00614e00
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003534"
              Value (ascii):       "45"
              Value (ebcdic):      "\\"

Auxiliary Access path Key offset, size: 6, 2
Access path Key name: KEY7                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: EQUAL TO
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003534"
              Value (ascii):       "45"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  00614200
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003534"
              Value (ascii):       "45"
              Value (ebcdic):      "\\"

Auxiliary Access path Key offset, size: 4, 2
Access path Key name: KEY3                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: GREATER THAN
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003333"
              Value (ascii):       "33"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: LESS THAN
          Upper Bound Selection Eval callback ID:  00613600
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003733"
              Value (ascii):       "37"
              Value (ebcdic):      "\ "
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_DATA_SELECTION
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple first call
RMS DDI: Call to DDI function
RMS DDI: Begin first key specifier pass
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: End of data
RMS DDI: 1 records read
%RMS-S-NORMAL, normal successful completion
 F1     F2     F3     F4     F5     F6                               
 15     25     35     45     55     record f                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_CLOSE_DATA_RELATION
1 row selected
SQL> select * from ADRI_DB
cont>   where   f3 = '35'
cont>     and '43' < f4
cont>     and   f4 < '47' ;
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_QUERY_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Reusing FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: This is a local file
RMS DDI: Call to DDI function
RMS DDI: Close RMS file
RMS DDI: Close for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI: Decrementing stream count:  7
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_OPEN_DATA_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Reusing FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_ALLOCATE_METADATA_MEM
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_RECEIVE_METADATA_INFO
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_ACCESS_PATH

Primary Access path Key offset, size: 6, 2
Access path Key name: KEY7                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: GREATER THAN
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003334"
              Value (ascii):       "43"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: LESS THAN
          Upper Bound Selection Eval callback ID:  00611600
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003734"
              Value (ascii):       "47"
              Value (ebcdic):      "\ "

Auxiliary Access path Key offset, size: 6, 2
Access path Key name: KEY4                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: GREATER THAN
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003334"
              Value (ascii):       "43"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: LESS THAN
          Upper Bound Selection Eval callback ID:  00627200
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003734"
              Value (ascii):       "47"
              Value (ebcdic):      "\ "

Auxiliary Access path Key offset, size: 4, 2
Access path Key name: KEY3                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: EQUAL TO
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003533"
              Value (ascii):       "35"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  00626e00
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003533"
              Value (ascii):       "35"
              Value (ebcdic):      "\\"

Auxiliary Access path Key offset, size: 4, 2
Access path Key name: KEY6                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: EQUAL TO
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003533"
              Value (ascii):       "35"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: EQUAL TO
          Upper Bound Selection Eval callback ID:  0061da00
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003533"
              Value (ascii):       "35"
              Value (ebcdic):      "\\"
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_DATA_SELECTION
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple first call
RMS DDI: Call to DDI function
RMS DDI: Begin first key specifier pass
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: End of data
RMS DDI: 1 records read
%RMS-S-NORMAL, normal successful completion
 F1     F2     F3     F4     F5     F6                               
 15     25     35     45     55     record f                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_CLOSE_DATA_RELATION
1 row selected
SQL> select * from ADRI_DB
cont>   where '33' < f3
cont>     and   f3 < '37'
cont>     and '43' < f4
cont>     and   f4 < '47' ;
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_QUERY_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Reusing FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: This is a local file
RMS DDI: Call to DDI function
RMS DDI: Close RMS file
RMS DDI: Close for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI: Decrementing stream count:  8
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_OPEN_DATA_RELATION
RMS DDI: Call to DDI function
RMS DDI: Open RMS file
RMS DDI: Reusing FIT entry for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI:-Opening data relation = "ADRI_DB"
RMS DDI:-Related file at location = "devname:[directory]ADRI.DAT"
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_ALLOCATE_METADATA_MEM
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_RECEIVE_METADATA_INFO
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_ACCESS_PATH

Primary Access path Key offset, size: 4, 2
Access path Key name: KEY6                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: GREATER THAN
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003333"
              Value (ascii):       "33"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: LESS THAN
          Upper Bound Selection Eval callback ID:  0062b600
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003733"
              Value (ascii):       "37"
              Value (ebcdic):      "\ "

Auxiliary Access path Key offset, size: 6, 2
Access path Key name: KEY4                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: GREATER THAN
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003334"
              Value (ascii):       "43"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: LESS THAN
          Upper Bound Selection Eval callback ID:  0062e200
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003734"
              Value (ascii):       "47"
              Value (ebcdic):      "\ "

Auxiliary Access path Key offset, size: 6, 2
Access path Key name: KEY7                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: GREATER THAN
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003334"
              Value (ascii):       "43"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: LESS THAN
          Upper Bound Selection Eval callback ID:  0062de00
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003734"
              Value (ascii):       "47"
              Value (ebcdic):      "\ "

Auxiliary Access path Key offset, size: 4, 2
Access path Key name: KEY3                            
RMS DDI: #key specifiers: 1

         Key #1
      Lower bound
          Operator type: GREATER THAN
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003333"
              Value (ascii):       "33"
              Value (ebcdic):      "\\"
      Upper bound
          Operator type: LESS THAN
          Upper Bound Selection Eval callback ID:  0062ba00
          Value size: 2
            Offset (within key):   0
              Value (hex):         "00003733"
              Value (ascii):       "37"
              Value (ebcdic):      "\ "
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_SET_DATA_SELECTION
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple first call
RMS DDI: Call to DDI function
RMS DDI: Begin first key specifier pass
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
 F1     F2     F3     F4     F5     F6                               
 14     24     34     44     54     record e                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
 15     25     35     45     55     record f                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_GET_NEXT_TUPLE
RMS DDI: Call to DDI function
RMS DDI: Get Next Tuple subsequent call
RMS DDI: Call to RMS service
RMS DDI: SYS$GET
RMS DDI: End of data
RMS DDI: 3 records read
%RMS-S-NORMAL, normal successful completion
 16     26     36     46     56     record g                         
RMS DDI: Call to DDI function
RMS DDI: NSDS$DDI_CLOSE_DATA_RELATION
3 rows selected
exit ;
RMS DDI: Call to RMS service
RMS DDI: NSDS$DDI_COMMIT_TRANSACTION
RMS DDI: Call to DDI function
RMS DDI: cleanup_xact
RMS DDI: Call to DDI function
RMS DDI: Close RMS file
RMS DDI: Close for relation ADRI_DB, database 28BC00
RMS DDI: FIT:  4DAC00, FAB:  4D5C00
RMS DDI: Decrementing stream count:  8
RMS DDI: Disconnecting record stream
RMS DDI: Call to RMS service
RMS DDI: SYS$DISCONNECT
RMS DDI: Call to RMS service
RMS DDI: SYS$CLOSE
RMS DDI: Releasing FIT db: 4DAC60, database 28BC00
$ !
$ close sys$output
$ deassign sys$output