Copyright © 2006 Fidelity National Information Services, Inc.
May 03, 2006
Revision History | |
---|---|
Revision 1.1 | 03 May 2006 |
Revision 1.0 | 06 September 2005 |
GT.M Group Fidelity National Information Services, Inc. 2 West Liberty Boulevard, Suite 300 Malvern, PA 19355, United States of America |
GT.M Support: +1 (610) 578-4226 Switchboard: +1 (610) 296-8877 Fax: +1 (484) 595-5101 http://www.fis-gtm.com gtmsupport@fnf.com |
Table of Contents
This technical bulletin discusses the following new features regarding null subscripts introduced effective V5.0-000:
An option for a database to allow existing data with null subscripts but prohibit creating new data with null subscripts.
New keywords for the NULL_SUBSCRIPTS qualifier of GDE and DSE.
An option to allow M local and global variables to collate the null subscript before all other subscripts, in compliance with the M standard.
UNIX-style command syntax (i.e., "-" for flags/qualifiers) is used throughout this document. On VMS, flags/qualifiers should be preceded with "/" |
Prior to this version, GT.M had an option to either prohibit or permit null subscripts in a database. This version further refines the choices by adding an option to have databases where existing nodes with null subscripts are accepted, but updates with null subscripts (except Kill) are not allowed. At the same time, a database creation time option is added to collate null subscripts before numeric and string subscripts, as specified by the M standard. Prior to this version, GT.M collated null subscripts after numeric subscripts and before string subscripts. With the exception of application logic that makes explicit or implicit assumptions about the collation of null subscripts, any existing GT.M programs continue to operate with no functional change in behavior.
The NULL SUBSCRIPTS database file header field which in prior releases had the values TRUE and FALSE is extended to permit the values ALWAYS (synonymous with TRUE, which is deprecated but continues to be supported), NEVER (synonymous with FALSE, which is also deprecated and also continues to be supported) and a new value, EXISTING. Please note that TRUE and ALWAYS are internally the same, as are FALSE and NEVER. This means that GDE and DSE will only display the values as ALWAYS and NEVER.
There is no change to GT.M behavior for any database file if the field is ALWAYS/TRUE or NEVER/FALSE. Existing programs and databases therefore continue to operate unchanged.
For any region for which the NULL SUBSCRIPTS field has the value EXISTING:
SETs to nodes to that region behave as if the value of the file header field is NEVER/FALSE
A SET operation to a global in that region where any subscript of the global is null generates a runtime error.
A MERGE operation into a global in that region terminates with an error if and when any subscript of any node being set is null.
Reads (e.g., $GET) from nodes with null subscripts
If the node has a value, that value is returned. If the value does not exist, a null is returned if VIEW "NOUNDEF" is set, or a runtime error is generated if VIEW "UNDEF" is set. The behavior of $DATA(), $ORDER(), $QUERY(), naked references, transaction semantics, etc. remain unchanged from the present.
Removal of nodes with null subscripts behaves as if the value of the file header field is ALWAYS/TRUE.
A KILL or ZWITHDRAW operation of a global in that region is permitted, either a direct KILL/ZWITHDRAW of a global any subscript of which is null, or a KILL of a higher-level sub-tree in which one or more nodes have subscripts that are null.
The DSE FILEHEADER qualifier NULL_SUBSCRIPTS permits the new keywords for values in the NULL_SUBSCRIPTS field. Also, the DSE DUMP command displays the new keywords in the file header output.
The GDE REGION qualifier NULL_SUBSCRIPTS accepts the keywords ALWAYS, NEVER and EXISTING. The existing argument-less qualifiers NULL_SUBSCRIPTS (synonymous with NULL_SUBSCRIPTS=ALWAYS) and NONULL_SUBSCRIPTS (synonymous with -NULL_SUBSCRIPTS=NEVER) will be deprecated but continue to be supported. Also, the GDE SHOW command displays the new keywords in the “Null Subs” column.
MUPIP CREATE creates database files with the new values for NULL_SUBSCRIPTS.
The default collation of local and global variable subscripts in GT.M has been that the null subscript collates between numeric and string subscripts whereas the M standard collation requires the null subscript to collate before any other subscript. Effective V5.0-000, GT.M supports both null collation methods. The collation method must be specified at the time of database creation.
A new read-only boolean parameter STDNULLCOLL is introduced in the database fileheader to specify the type of null collation:
If STDNULLCOLL is set to FALSE, subscripts of globals in the database continue the previous GT.M practice where the null subscript collates between numeric and string subscripts.
If STDNULLCOLL is set to TRUE, subscripts of globals in the database follow the M standard where the null subscript collates before all other subscripts.
When a database is created, the STDNULLCOLL parameter is initialized to the collation specified for that region in the global directory.
To establish the null collation method for a specified database, GDE supports a new region parameter STDNULLCOLL that can be set to TRUE or FALSE using a new region qualifier -STDNULLCOLL or -NOSTDNULLCOLL respectively. These qualifiers are supported with ADD, CHANGE and TEMPLATE commands. When MUPIP creates a new database, the STDNULLCOLL value is copied from the global directory into the database file header.
For M local variables, the null collation can be established either at startup or during run time. Since the same local collation method is established for all locals in a process, changing the null collation within the process is allowed only if there are no local variables defined at that time. At process startup, GT.M uses the following:
The M standard null collation if an environment variable gtm_lct_stdnull [UNIX] or GTM_LCT_STDNULL [VMS] is defined to either TRUE or YES (or a case-insensitive leading substring thereof) or a non-zero integer.
The GT.M standard null collation if the environment variable or the logical name is not defined or defined to any other value.
To establish a default collation version for local variables within the process, the percent utility %LCLCOL supports establishing the null collation method as well. set^%LCLCOL(col,ncol) accepts an optional parameter ncol that determines the null collation type to be used with the collation type col.
If the truth value of ncol is FALSE(0), local variables use the GT.M standard null collation.
If the truth value of ncol is TRUE(1), local variables use the M standard null collation.
If ncol is not supplied, there is no change to the already established null collation method.
Also using set^%LCLCOL(,ncol), the null collation order can be changed while keeping the alternate collation order unchanged. If subscripted local variables exist, null collation order cannot be changed. In this case, GT.M issues GTM-E-COLLDATAEXISTS.
If the M standard default collation is not enabled by any of the above mechanisms or if numeric subscripts are handled like strings (i.e. NCT is enabled), GT.M behaves in the same manner as before. |
The -REGION qualifier –[NO]NULL_SUBCRIPTS now accepts new values with change, add and template commands, default is –NONULL_SUBSCRIPTS, e.g.:
GDE>add –region areg –dyn=aseg –null_subscripts=always GDE>change –region areg –null_subscripts=true GDE>change –region areg –null_subscripts=false GDE>change –region areg –null_subscripts=never GDE>change –region areg –null_subscripts=existing GDE>template –region –null_subscripts=existing GDE>template –region –nonull_subscripts
Also, GDE now supports a new region qualifier –[NO]STDNULLCOLL with add, change and template command, default is –NOSTDNULLCOLL.
From this version, GT.M supports longer (up to 31 characters) identifiers, label names, region names and segment names. To accommodate all these changes as well as null_subscripts changes, GDE show output has been modified.
GDE> template -region -stdnullcoll GDE> change -region DEFAULT -stdnullcoll GDE> add -segment TEAGLOBALS -file=TEAGLOBALS.dat GDE> add -region TEAGLOBALS -dyn=TEAGLOBALS -null_subscripts=existing GDE> add -name LapsangSouchong -region=TEAGLOBALS GDE> add -name Darjeeling -region=TEAGLOBALS GDE> add -name Tea* -region=TEAGLOBALS GDE> show -all *** TEMPLATES *** Def Rec Key Null Standard Region Coll Size Size Subs NullColl Journaling -------------------------------------------------------------------------------------------- <default> 0 256 64 NEVER Y N Segment Active Acc Typ Block Alloc Exten Options ------------------------------------------------------------------------------ <default> * BG DYN 1024 100 100 GLOB =1024 LOCK = 40 <default> MM DYN 1024 100 100 DEFER LOCK = 40 *** NAMES *** Global Region ------------------------------------------------------------------------------ * DEFAULT Darjeeling TEAGLOBALS LapsangSouchong TEAGLOBALS Tea* TEAGLOBALS *** REGIONS *** Dynamic Def Rec Key Null Standard Region Segment Coll Size Size Subs NullColl Journaling ------------------------------------------------------------------------------------------------------------------ DEFAULT DEFAULT 0 256 64 NEVER Y N TEAGLOBALS TEAGLOBALS 0 256 64 EXISTING Y N *** SEGMENTS *** Segment File (def ext: .dat)Acc Typ Block Alloc Exten Options ------------------------------------------------------------------------------------------- DEFAULT mumps.dat BG DYN 1024 100 100 GLOB=1024 LOCK= 40 RES = 0 TEAGLOBALS TEAGLOBALS.dat BG DYN 1024 100 100 GLOB=1024 LOCK= 40 RES = 0 *** MAP *** - - - - - - - - - - Names - - - - - - - - - - From Up to Region / Segment / File(def ext: .dat) ----------------------------------------------------------------------------------------------------------------------------------- % Darjeeling REG = DEFAULT SEG = DEFAULT FILE = mumps.dat Darjeeling Darjeeling0 REG = TEAGLOBALS SEG = TEAGLOBALS FILE = TEAGLOBALS.dat Darjeeling0 LapsangSouchong REG = DEFAULT SEG = DEFAULT FILE = mumps.dat LapsangSouchong LapsangSouchong0 REG = TEAGLOBALS SEG = TEAGLOBALS FILE = TEAGLOBALS.dat LapsangSouchong0 Tea REG = DEFAULT SEG = DEFAULT FILE = mumps.dat Tea Teb REG = TEAGLOBALS SEG = TEAGLOBALS FILE = TEAGLOBALS.dat Teb ... REG = DEFAULT SEG = DEFAULT FILE = mumps.dat LOCAL LOCKS REG = DEFAULT SEG = DEFAULT FILE = mumps.dat GDE>
In addition to true/false, the -null_subscripts qualifier now accepts never, always and existing. The default qualifier is never.
The null subscript collation order cannot be changed using DSE. |
dump –fileheader output reflects these changes for null_subscripts as well as null collation order.
For a region, “Standard Null Collation” in dse dump output corresponds to -stdnullcoll field in .gld file. DSE displays TRUE for “Standard Null Collation” if the region has –STDNULLCOLL, otherwise it displays FALSE
From the example in GDE Changes above, output of dump –fileheader for TEAGLOBALS.dat will be as follows:
DSE> dump -fileheader File /tmp/mumps.dat Region DEFAULT Date/Time 19-MAY-2005 18:51:43 [$H = 60039,67903] Access method BG Global Buffers 1024 Reserved Bytes 0 Block size (in bytes) 4096 Maximum record size 4088 Starting VBN 49 Maximum key size 255 Total blocks 0x00000065 Null subscripts EXISTING Free blocks 0x00000049 Standard Null Collation FALSE Last Record Backup 0x00000001 Extension Count 100 Last Database Bckup 0x00000001 Number of local maps 1 Last Bytestream Bckup 0x00000001 Lock space 0x00000028 In critical section 0x00000000 Timers pending 0 Cache freeze id 0x00000000 Flush timer 00:00:01:00 Freeze match 0x00000000 Flush trigger 960 Current transaction 0x000007CE No. of writes/flush 7 Create in progress FALSE Modified cache blocks 0 Reference count 1 Wait Disk 0 Journal State [inactive] ON Journal Before imaging TRUE Journal Allocation 100 Journal Extension 100 Journal Buffer Size 1000 Journal Alignsize 128 Journal AutoSwitchLimit 8388600 Journal Epoch Interval 300 Journal Yield Limit 8 Journal Sync IO FALSE Journal File: /tmp/mumps.mjl Mutex Hard Spin Count 128 Mutex Sleep Spin Count 128 Mutex Spin Sleep Time 2048 KILLs in progress 0 Replication State OFF Region Seqno 0x0000000000000001 Resync Seqno 0x0000000000000001 Resync transaction 0x00000001
With Standard null collation, the null subscript is represented by 0x01 instead of 0xFF with GT.M null collation. So, the output of dse dump -block for a null subscript will also be different.
DSE>dump -block=3 File /testarea1/null_subs/mumps.dat Region DEFAULT Block 3 Size 24 Level 0 TN 3 Rec:1 Blk 3 Off 8 Size A Cmpc 0 Key ^a("") 8 : | 0 A 0 0 61 0 1 0 0 31 | | . . . . a . . . . 1 |
With GT.M null collation, for the same command output will be as follows:
DSE>dump -block=3 File /testarea1/null_subs/mumps.dat Region DEFAULT 3 Size 24 Level 0 TN 3 Rec:1 Blk 3 Off 8 Size A Cmpc 0 Key ^a("") 8 : | 0 A 0 0 61 0 FF 0 0 31 | | . . . . a . . . . 1 |
ZWRITE:
Since with standard collation null subscripts collate before numeric and string subscripts, ZWR output will be different if nodes with null subscripts exist.
GTM>ZWR lcl("")=2 lcl(1)=3 lcl("x")=4
With same data and GT.M null collation the output of ZWR will be as follows:
lcl(1)=3 lcl("")=2 lcl("x")=4
$ORDER():
If the last subscript in the subscripted global or local variable name passed as a parameter to $Order() is null and a subscripted global or local variable with a null subscript exists, $ORDER() returns the next node at the specified level.
If the last subscript in the subscripted global or local variable name passed as a parameter to $Order() is null and a subscripted global or local variable with a null subscript does not exist, $ORDER() returns first node at the specified level.
If the last subscript in the subscripted global or local variable name is null and second argument of $ORDER() is -1, $ORDER() will always return the last node at the specified level regardless of the existence of subscripted global or local variable (with null subscript). This allows the user to traverse all the nodes in a specified level starting from the last.
GTM>ZWRITE lcl(1)=3 lcl("x")=4 GTM>WRITE $ORDER(lcl("")) 1 GTM>WRITE $ORDER(lcl(1)) x GTM>WRITE $ORDER(lcl(""),-1) x GTM>SET lcl("")=2 GTM>ZWRITE lcl("")=2 lcl(1)=3 lcl("x")=4 GTM>WRITE $ORDER(lcl("")) 1 GTM>WRITE $ORDER(lcl(""),-1) x GTM>WRITE $ORDER(lcl("x"),-1) 1
$ZPREVIOUS() : is equivalent to $ORDER() with second argument -1.
$QUERY(): With stdnullcoll, if $D(glvn(""))=1 (or 11), $Q(glvn("")) will return glvn(1) [assuming glvn(1) exists]. Software should execute $D(glvn("")) to test the existence of glvn(""). $Q(glvn("...")) will never return the starting-point (glvn("")) even though glvn("") may exist.
GTM>ZWRITE lcl lcl("")=1 lcl(1)=1 lcl(1,2)=2 lcl(1,2,"")=3 lcl(1,2,"","")=4 lcl(1,2,"","",4)=5 lcl(1,2,0)=6 lcl(1,2,"abc",5)=7 lcl("x")=1 GTM>SET y="x” GTM>FOR SET y=$QUERY(@y) QUIT:y="" WRITE !,y,"=",@y
Output will be the same as ZWRITE output.
For more details about the behavior of these functions with GT.M Null Collation, please consult “GT.M Programmer’s Guide.”
MUPIP EXTRACT -BINARY issues NULLCOLLDIFF error if it needs to extract from multiple databases with different STDNULCOLL settings.
MUPIP EXTRACT -BINARY writes a new field in the binary extract header to note down the first database's STDNULCOLL setting.
MUPIP LOAD –BINARY works with V4 format binary extract files. In this case, it assumes the STDNULCOLL setting is FALSE (i.e. GTM null collation).
MUPIP LOAD –BINARY on a V5 binary extract transforms the null subscripts appropriately if the STDNULCOLL setting of the target database is different from the setting in the binary extract header.
MUPIP LOAD –BINARY is able to successfully load onto multiple databases with different STDNULCOLL settings.
MUPIP EXTRACT -ZWR and MUPIP LOAD -ZWR will work no matter what the GT.M version of the source and destination databases, and no matter what the null (or other) collation setting of the source and destination databases. Note, however, that other restrictions may apply, such as moving global variables with long names from a V5 database to a V4 database.
In a replicated environment, all databases belonging to an instance should have the same null collation order. If this condition is not met, the source server issues the GTM-E-NULLCOLLDIFF error message on the primary. On the secondary, the update process issues the same error message if the condition is not satisfied.
Although all databases belonging to an instance must have the same collation method, GT.M allows the primary and secondary to use different null collation methods. Any needed conversion is handled internally and transparently.
The server side's null collation order overrides client side's null collation order. For a given region, on the server side (Version V5.0-000 or later), if NULLSUBS is set to EXISTING or STD_NULL_COLL is set to TRUE and client side is running a version prior to V5, then server side will issue GTM-E-UNIMPOP error with GTM-I_TEXT- "Client does not support standard null collation or EXISTING for null subscripts."
Again for a given region, on the client side running V5 version, if null_subs is set to EXISTING or STD_NULL_COLL is set to true and the server side is running a version prior to V5, then client the side's null_subs/null collation order will be overridden by server side's setting (prior to V5.0-000, null_subs can be only true or false and STD_NULL_COLL is always false).
NULLCOLLDIFF |
Null collation order cannot be different for all regions |
Severity: |
Error |
Run Time Error: |
Standard null collation setting is not same for all regions. |
Action: |
Using GDE –show or DSE dump –fileheader, check standard null collation field for all regions and make sure they are same. |
NCTCOLLDIFF |
Source and destination for MERGE cannot have different numerical collation type |
Severity: |
Error |
Run Time Error: |
This indicates that the merge commands two arguments have different numerical collation type. |
Action: |
Using %GBLDEF utility make numerical collation type of both arguments same. |
For further information, refer to GT.M V5.0-000D Supplementary Information.
Command Syntax: UNIX syntax (i.e., lowercase text and "-" for flags/qualifiers) is used throughout this document. VMS accepts both lowercase and uppercase text; flags/qualifiers should be preceded with "/".
Reference Number: The reference numbers used to track software enhancements and customer support requests appear in parentheses ( ).
Platform Identifier: If a new feature or software enhancement does not apply to all platforms, the relevant platform appears in brackets [ ].