MINI MINI MANI MO
<?xml version="1.0"?>
<!--
Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved.
NAME
kuscnstr.xsl
DESCRIPTION
Generate SXML for constraints
MODIFIED MM/DD/YY
tbhukya 01/05/15 - Bug 20319428: Declare referred params
lbarton 06/04/14 - bug 18750140: valid-time temporal
abodge 06/03/14 - CM MODIFIED: Sort constraint names
abodge 09/21/09 - CONSOLIDATE STYLESHEETS: MAKE_DIFF_READY -> CM_MODE
rapayne 12/15/08 - add IGNORE_NAME_DIFFERENCES attribute for CM
rapayne 05/05/08 - backout change of SET NULL.
rapayne 03/01/08 - Add COMPUTE_CONSTR_DEF attrib for CM
Change SET_NULL to SET NULL
rapayne 01/28/08 - fix flags check for foreign key constraints.
lbarton 11/27/07 - bug 6474004: RELY
rapayne 12/04/06 - Integrate EM specific changes
lbarton 11/03/06 - USING_INDEX transform param
lbarton 06/23/06 - PARSE_EXPRESSIONS param
lbarton 03/27/06 - bug 5118027: CONSTRAINTS and REF_CONSTRAINTS params
for SXML
lbarton 11/08/05 - bug 4724986: declare parameter to EnableDisable
rapayne 11/02/05 - Bug 4715313: Reformat with XMLSpy
lbarton 09/15/05 - bugfix in USING_INDEX processing
lbarton 08/10/05 - lbarton_mddiff
lbarton 11/01/04 - Initial version
-->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://xmlns.oracle.com/ku">
<!-- Top level imports -->
<xsl:import href="kuscomm.xsl"/>
<xsl:import href="kusidxwk.xsl"/>
<!-- Top-level parameters -->
<xsl:param name="USING_INDEX">1</xsl:param>
<xsl:param name="CONSTRAINTS">1</xsl:param>
<xsl:param name="REF_CONSTRAINTS">1</xsl:param>
<xsl:param name="PARSE_EXPRESSIONS">0</xsl:param>
<!-- Parameters to direct diffing of constraints -->
<xsl:param name="MATCH_CONSTR_BY_DEFINITION">0</xsl:param>
<xsl:param name="IGNORE_NAME_DIFFERENCES">0</xsl:param>
<!-- Templates -->
<xsl:template name="TableConstraints">
<!-- *******************************************************************
Template: TableConstraints
Current node: TABLE_T or IONT
******************************************************************** -->
<xsl:if test="$CONSTRAINTS!=0">
<xsl:call-template name="CheckConstraints">
<xsl:with-param name="Property" select="PROPERTY"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="$CONSTRAINTS!=0 or (PROPERTY mod 128)>=64 or local-name(.)='IONT'">
<xsl:call-template name="PKConstraints">
<xsl:with-param name="Property" select="PROPERTY"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="$CONSTRAINTS!=0">
<xsl:call-template name="UKConstraints">
<xsl:with-param name="Property" select="PROPERTY"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="$REF_CONSTRAINTS!=0">
<xsl:call-template name="FKConstraints">
<xsl:with-param name="Property" select="PROPERTY"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="$CONSTRAINTS!=0">
<xsl:call-template name="ScopeConstraints"/>
<xsl:call-template name="RowidConstraints"/>
</xsl:if>
</xsl:template>
<xsl:template name="CheckConstraints">
<xsl:param name="Property">0</xsl:param>
<!-- *******************************************************************
Template: CheckConstraints
Current node: TABLE_T
Parameters:
Property: TABLE_T/PROPERTY
Ignore internally generated constr for valid-time temporal (FLAGS bit 2048)
******************************************************************** -->
<xsl:if test="CON1_LIST/CON1_LIST_ITEM[CONTYPE='1' and (FLAGS mod 4096) < 2048]">
<xsl:element name="CHECK_CONSTRAINT_LIST">
<xsl:choose>
<xsl:when test="$CM_MODE=1">
<xsl:for-each select="CON1_LIST/CON1_LIST_ITEM[CONTYPE='1' and (FLAGS mod 4096) < 2048]">
<xsl:sort select="NAME" data-type="text" lang="en"/>
<xsl:element name="CHECK_CONSTRAINT_LIST_ITEM">
<xsl:call-template name="CheckConstraintBody">
<xsl:with-param name="Property" select="$Property"/>
</xsl:call-template>
</xsl:element>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="CON1_LIST/CON1_LIST_ITEM[CONTYPE='1' and (FLAGS mod 4096) < 2048]">
<xsl:element name="CHECK_CONSTRAINT_LIST_ITEM">
<xsl:call-template name="CheckConstraintBody">
<xsl:with-param name="Property" select="$Property"/>
</xsl:call-template>
</xsl:element>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:if>
</xsl:template>
<xsl:template name="CheckConstraintBody">
<xsl:param name="Property">0</xsl:param>
<!-- *******************************************************************
Template: CheckConstraintBody
Current node: TABLE_T/CON1_LIST/CON1_LIST_ITEM[CONTYPE='1']
Parameters:
Property: TABLE_T/PROPERTY
******************************************************************** -->
<xsl:if test="$CM_MODE=1">
<xsl:attribute name="MATCH_CONSTR_BY_DEFINITION"><xsl:value-of select="$MATCH_CONSTR_BY_DEFINITION"/></xsl:attribute>
<xsl:attribute name="IGNORE_NAME_DIFFERENCES"><xsl:value-of select="$IGNORE_NAME_DIFFERENCES"/></xsl:attribute>
<xsl:attribute name="NAME"><xsl:value-of select="NAME"/></xsl:attribute>
</xsl:if>
<xsl:if test="not((FLAGS mod 16)>=8)">
<xsl:element name="NAME">
<xsl:value-of select="NAME"/>
</xsl:element>
</xsl:if>
<xsl:choose>
<xsl:when test="$PARSE_EXPRESSIONS=1 and PARSED_COND">
<xsl:element name="PARSED_CONDITION">
<xsl:copy-of select="PARSED_COND/*"/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="CONDITION">
<xsl:if test="$CM_MODE=1">
<xsl:attribute name="COMPUTE_CONSTR_DEF">TRUE</xsl:attribute>
</xsl:if>
<xsl:value-of select="CONDITION"/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name="ConstraintState">
<xsl:with-param name="Property" select="$Property"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="ConstraintState">
<xsl:param name="Property">0</xsl:param>
<!-- *******************************************************************
Template: ConstraintState
Current node: CON_LIST_ITEM
Parameters:
Property: TABLE_T/PROPERTY
******************************************************************** -->
<xsl:if test="FLAGS">
<xsl:if test="(FLAGS mod 2)=1">
<xsl:element name="DEFERRABLE"/>
<xsl:if test="(FLAGS mod 4)>=2">
<xsl:element name="INITIALLY_DEFERRED"/>
</xsl:if>
</xsl:if>
</xsl:if>
<xsl:if test="FLAGS">
<xsl:if test="(FLAGS mod 64)>=32">
<xsl:element name="RELY"/>
</xsl:if>
</xsl:if>
<xsl:call-template name="EnableDisable">
<xsl:with-param name="ConNode" select="."/>
</xsl:call-template>
<xsl:if test="not ($SEGMENT_ATTRIBUTES=0) and
not ($PHYSICAL_PROPERTIES=0) and
not ($USING_INDEX=0)">
<!-- using_index_clause (much of this logic is from kuconstr.xsl) -->
<!-- index for other than
(a) temporary index
(obj$.flags bit 02 = temporary object)
with system generated name ('SYS_C')
or
(b) IOT (obj$.property bit 64) primary key (contype=2)
-->
<!--xsl:if test="IND and
not (((IND/BASE_OBJ/FLAGS mod 4)>=2 and
starts-with(IND/SCHEMA_OBJ/NAME,'SYS_C')) or
(($Property mod 128)>=64 and CONTYPE='2'))"-->
<xsl:if test="IND and
not (((IND/BASE_OBJ/FLAGS mod 4)>=2) or
(($Property mod 128)>=64 and CONTYPE='2'))">
<xsl:element name="USING_INDEX">
<xsl:choose>
<!-- Non-system-generated name
and (pkoid (obj$.property bit 4096 = has pk-based OID column)
or unnamed ('SYS_C') constraint index
marked system-generated (obj$.flags bit 4 = system-generated)
-->
<xsl:when test="not(starts-with(IND/SCHEMA_OBJ/NAME,'SYS_C')) and
((($Property mod 8192)>=4096 and CONTYPE='2') or
(starts-with(NAME,'SYS_C') and
(IND/SCHEMA_OBJ/FLAGS mod 8)>=4))">
<!-- full INDEX SXML clause -->
<xsl:call-template name="DoIndex">
<xsl:with-param name="IndNode" select="IND"/>
<xsl:with-param name="ConstraintIndex">1</xsl:with-param>
</xsl:call-template>
</xsl:when>
<!-- not a temporary index -->
<xsl:when test="2>(IND/BASE_OBJ/FLAGS mod 4)">
<!-- index properties -->
<xsl:call-template name="IndexProperties">
<xsl:with-param name="IndNode" select="IND"/>
<xsl:with-param name="ConstraintIndex">1</xsl:with-param>
</xsl:call-template>
</xsl:when>
</xsl:choose>
</xsl:element>
</xsl:if>
</xsl:if>
<xsl:if test="$CM_MODE=1">
<!-- Change Manager extension to record the index schema and name
if it is included in the constraint XML -->
<xsl:if test="IND/SCHEMA_OBJ/NAME">
<xsl:element name="INDEX_OWNER">
<!-- This element should not be counted as or displayed as a diff -->
<xsl:attribute name="no_diff">1</xsl:attribute>
<xsl:value-of select="IND/SCHEMA_OBJ/OWNER_NAME"/>
</xsl:element>
<xsl:element name="INDEX_NAME">
<!-- This element should not be counted as or displayed as a diff -->
<xsl:attribute name="no_diff">1</xsl:attribute>
<xsl:value-of select="IND/SCHEMA_OBJ/NAME"/>
</xsl:element>
</xsl:if>
</xsl:if>
</xsl:template>
<xsl:template name="PKConstraints">
<xsl:param name="Property">0</xsl:param>
<!-- *******************************************************************
Template: PKConstraints
Current node: TABLE_T or IONT
Parameters:
Property: TABLE_T/PROPERTY
******************************************************************** -->
<!-- CONTYPE 2 = primary key
-->
<xsl:if test="CON1_LIST/CON1_LIST_ITEM[CONTYPE='2']">
<xsl:element name="PRIMARY_KEY_CONSTRAINT_LIST">
<xsl:choose>
<xsl:when test="$CM_MODE=1">
<xsl:for-each select="CON1_LIST/CON1_LIST_ITEM[CONTYPE='2']">
<xsl:sort select="NAME" data-type="text" lang="en"/>
<xsl:element name="PRIMARY_KEY_CONSTRAINT_LIST_ITEM">
<xsl:call-template name="PKConstraintBody">
<xsl:with-param name="Property" select="$Property"/>
</xsl:call-template>
</xsl:element>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="CON1_LIST/CON1_LIST_ITEM[CONTYPE='2']">
<xsl:element name="PRIMARY_KEY_CONSTRAINT_LIST_ITEM">
<xsl:call-template name="PKConstraintBody">
<xsl:with-param name="Property" select="$Property"/>
</xsl:call-template>
</xsl:element>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:if>
</xsl:template>
<xsl:template name="PKConstraintBody">
<xsl:param name="Property">0</xsl:param>
<!-- *******************************************************************
Template: PKConstraintBody
Current node: TABLE_T/CON1_LIST/CON1_LIST_ITEM[CONTYPE='2'] or
IONT/CON1_LIST/CON1_LIST_ITEM[CONTYPE='2']
Parameters:
Property: TABLE_T/PROPERTY
******************************************************************** -->
<xsl:if test="$CM_MODE=1">
<xsl:attribute name="MATCH_CONSTR_BY_DEFINITION"><xsl:value-of select="$MATCH_CONSTR_BY_DEFINITION"/></xsl:attribute>
<xsl:attribute name="IGNORE_NAME_DIFFERENCES"><xsl:value-of select="$IGNORE_NAME_DIFFERENCES"/></xsl:attribute>
<xsl:attribute name="NAME"><xsl:value-of select="NAME"/></xsl:attribute>
</xsl:if>
<xsl:if test="not((FLAGS mod 16)>=8)">
<xsl:element name="NAME">
<xsl:value-of select="NAME"/>
</xsl:element>
</xsl:if>
<xsl:call-template name="ConstraintColumnList">
<xsl:with-param name="ColListNode" select="COL_LIST"/>
</xsl:call-template>
<xsl:call-template name="ConstraintState">
<xsl:with-param name="Property" select="$Property"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="ConstraintColumnList">
<xsl:param name="ColListNode" select="''"/>
<!-- *******************************************************************
Template: ConstraintColumnList - Generate the simple column list
with NAME element only
Parameters:
ColListNode: COL_LIST node or SRC_COL_LIST node or TGT_COL_LIST node
******************************************************************** -->
<xsl:element name="COL_LIST">
<xsl:if test="$CM_MODE=1">
<xsl:attribute name="COMPUTE_CONSTR_DEF">TRUE</xsl:attribute>
</xsl:if>
<xsl:for-each select="$ColListNode/COL_LIST_ITEM |
$ColListNode/SRC_COL_LIST_ITEM |
$ColListNode/TGT_COL_LIST_ITEM">
<xsl:element name="COL_LIST_ITEM">
<xsl:call-template name="ColName">
<xsl:with-param name="ColNode" select="COL"/>
</xsl:call-template>
<!-- Add Any Supplemental Log Group NOLOG element -->
<xsl:if test="(SPARE1 mod 2)=1">
<xsl:element name="NOLOG"/>
</xsl:if>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
<xsl:template name="UKConstraints">
<xsl:param name="Property">0</xsl:param>
<!-- *******************************************************************
Template: UKConstraints
Current node: TABLE_T
Parameters:
Property: TABLE_T/PROPERTY
******************************************************************** -->
<!-- CONTYPE 3 = unique key
OID_OR_SETID non-0 = hidden unique constraint on OID column
or nested tbl column's SETID column
-->
<xsl:if test="CON1_LIST/CON1_LIST_ITEM[CONTYPE='3' and
COL_LIST/COL_LIST_ITEM/OID_OR_SETID='0']">
<xsl:element name="UNIQUE_KEY_CONSTRAINT_LIST">
<xsl:choose>
<xsl:when test="$CM_MODE=1">
<xsl:for-each select="CON1_LIST/CON1_LIST_ITEM[CONTYPE='3' and
COL_LIST/COL_LIST_ITEM/OID_OR_SETID='0']">
<xsl:sort select="NAME" data-type="text" lang="en"/>
<xsl:element name="UNIQUE_KEY_CONSTRAINT_LIST_ITEM">
<xsl:call-template name="UKConstraintBody">
<xsl:with-param name="Property" select="$Property"/>
</xsl:call-template>
</xsl:element>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="CON1_LIST/CON1_LIST_ITEM[CONTYPE='3' and
COL_LIST/COL_LIST_ITEM/OID_OR_SETID='0']">
<xsl:element name="UNIQUE_KEY_CONSTRAINT_LIST_ITEM">
<xsl:call-template name="UKConstraintBody">
<xsl:with-param name="Property" select="$Property"/>
</xsl:call-template>
</xsl:element>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:if>
</xsl:template>
<xsl:template name="UKConstraintBody">
<xsl:param name="Property">0</xsl:param>
<!-- *******************************************************************
Template: UKConstraintBody
Current node: TABLE_T/CON1_LIST/CON1_LIST_ITEM[CONTYPE='3']
Parameters:
Property: TABLE_T/PROPERTY
******************************************************************** -->
<xsl:if test="$CM_MODE=1">
<xsl:attribute name="MATCH_CONSTR_BY_DEFINITION"><xsl:value-of select="$MATCH_CONSTR_BY_DEFINITION"/></xsl:attribute>
<xsl:attribute name="IGNORE_NAME_DIFFERENCES"><xsl:value-of select="$IGNORE_NAME_DIFFERENCES"/></xsl:attribute>
<xsl:attribute name="NAME"><xsl:value-of select="NAME"/></xsl:attribute>
</xsl:if>
<xsl:if test="not((FLAGS mod 16)>=8)">
<xsl:element name="NAME">
<xsl:value-of select="NAME"/>
</xsl:element>
</xsl:if>
<xsl:call-template name="ConstraintColumnList">
<xsl:with-param name="ColListNode" select="COL_LIST"/>
</xsl:call-template>
<xsl:call-template name="ConstraintState">
<xsl:with-param name="Property" select="$Property"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="FKConstraints">
<xsl:param name="Property">0</xsl:param>
<!-- *******************************************************************
Template: FKConstraints
Current node: TABLE_T
Parameters:
Property: TABLE_T/PROPERTY
******************************************************************** -->
<!-- CONTYPE 4 = foreign key
-->
<xsl:if test="CON2_LIST/CON2_LIST_ITEM[CONTYPE='4']">
<xsl:element name="FOREIGN_KEY_CONSTRAINT_LIST">
<xsl:choose>
<xsl:when test="$CM_MODE=1">
<xsl:for-each select="CON2_LIST/CON2_LIST_ITEM[CONTYPE='4']">
<xsl:sort select="NAME" data-type="text" lang="en"/>
<xsl:element name="FOREIGN_KEY_CONSTRAINT_LIST_ITEM">
<xsl:call-template name="FKConstraintBody">
<xsl:with-param name="Property" select="$Property"/>
</xsl:call-template>
</xsl:element>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="CON2_LIST/CON2_LIST_ITEM[CONTYPE='4']">
<xsl:element name="FOREIGN_KEY_CONSTRAINT_LIST_ITEM">
<xsl:call-template name="FKConstraintBody">
<xsl:with-param name="Property" select="$Property"/>
</xsl:call-template>
</xsl:element>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
<!-- end of FOREIGN_KEY_CONSTRAINT_LIST -->
</xsl:element>
</xsl:if>
</xsl:template>
<xsl:template name="FKConstraintBody">
<xsl:param name="Property">0</xsl:param>
<!-- *******************************************************************
Template: FKConstraintBody
Current node: TABLE_T/CON2_LIST/CON2_LIST_ITEM[CONTYPE='4']
Parameters:
Property: TABLE_T/PROPERTY
******************************************************************** -->
<xsl:if test="$CM_MODE=1">
<xsl:attribute name="MATCH_CONSTR_BY_DEFINITION"><xsl:value-of select="$MATCH_CONSTR_BY_DEFINITION"/></xsl:attribute>
<xsl:attribute name="IGNORE_NAME_DIFFERENCES"><xsl:value-of select="$IGNORE_NAME_DIFFERENCES"/></xsl:attribute>
<xsl:attribute name="NAME"><xsl:value-of select="NAME"/></xsl:attribute>
</xsl:if>
<xsl:if test="not((FLAGS mod 16)>=8)">
<xsl:element name="NAME">
<xsl:value-of select="NAME"/>
</xsl:element>
</xsl:if>
<xsl:choose>
<!-- A referential constraint on a REF whose referenced object table
has an OID based on a PRIMARY KEY may specify multiple source
columns (one for each 'exploded' col/attr of the potentially
compound Primary key). The source col/attr names were 'corrected'
to specify the actual REF item when the metadata was collected,
however only 1 source column must be used in the constraint.
Example:
create type type1 as object (a1 number, a2 number);
create table table1 of type1 (primary key(a1, a2))
object identifier primary key;
create table table2 (c1 ref type1,
foreign key (c1) references table1);
Foreign key source columns generated:
c1.a1, c1.a2
each having column property 0x00200000 (2097152)
attribute column of a user-defined ref.
Corrected columns names stored, respectively:
c1, c1
-->
<xsl:when test="(SRC_COL_LIST/SRC_COL_LIST_ITEM/COL/PROPERTY mod 4194304)>=2097152">
<xsl:element name="COL_LIST">
<xsl:if test="$CM_MODE=1">
<xsl:attribute name="COMPUTE_CONSTR_DEF">TRUE</xsl:attribute>
</xsl:if>
<xsl:element name="COL_LIST_ITEM">
<xsl:call-template name="ColName">
<xsl:with-param name="ColNode" select="SRC_COL_LIST/SRC_COL_LIST_ITEM/COL"/>
</xsl:call-template>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="ConstraintColumnList">
<xsl:with-param name="ColListNode" select="SRC_COL_LIST"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
<xsl:element name="REFERENCES">
<xsl:if test="$CM_MODE=1">
<xsl:attribute name="COMPUTE_CONSTR_DEF">TRUE</xsl:attribute>
</xsl:if>
<xsl:apply-templates select="SCHEMA_OBJ"/>
<!-- A referential constraint on a REF whose referenced object table
has an OID based on a PRIMARY KEY may specify multiple target
columns (one for each col/attr of the potentially compound Primary
key - see above example). Do not emit the target col/attr list
if the ref attribute property exists for the [first] source col
(unneeded since it references the Primary key).
-->
<xsl:if test="(SRC_COL_LIST/SRC_COL_LIST_ITEM/COL/PROPERTY mod 4194304)<2097152">
<xsl:call-template name="ConstraintColumnList">
<xsl:with-param name="ColListNode" select="TGT_COL_LIST"/>
</xsl:call-template>
</xsl:if>
<!-- ON DELETE -->
<xsl:if test="REFACT">
<xsl:element name="ON_DELETE">
<xsl:choose>
<xsl:when test="REFACT='1'">CASCADE</xsl:when>
<xsl:when test="REFACT='2'">SET_NULL</xsl:when>
<!-- set default is in kuconstr.xsl but not in SQL Ref Manual -->
<xsl:otherwise>SET_DEFAULT</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:if>
<!-- end of REFERENCES -->
</xsl:element>
<xsl:call-template name="ConstraintState">
<xsl:with-param name="Property" select="$Property"/>
</xsl:call-template>
<!-- end of FOREIGN_KEY_CONSTRAINT_LIST_ITEM -->
</xsl:template>
<xsl:template name="ScopeConstraints">
<!-- *******************************************************************
Template: ScopeConstraints
Current node: TABLE_T
******************************************************************** -->
<!-- PKREFs with reftyp=1
reftyp number not null /* REF type flag */
/* 0x01 = REF is scoped */
/* 0x02 = REF stored with rowid */
/* 0x04 = Primary key based ref */
/* 0x08 = Allow unscoped Primary key based ref */
... Except that SCOPE is skipped if col. list FOREIGN KEY for that REF ...
foreignkey number, /* 1= scoped REF is also a foreign key */
-->
<xsl:if test="PKREF_LIST/PKREF_LIST_ITEM[(REFTYP mod 2)=1 and FOREIGNKEY=0]">
<xsl:element name="SCOPE_CONSTRAINT_LIST">
<xsl:for-each select="PKREF_LIST/PKREF_LIST_ITEM[
(REFTYP mod 2)=1 and FOREIGNKEY=0]">
<xsl:element name="SCOPE_CONSTRAINT_LIST_ITEM">
<xsl:element name="COL">
<xsl:value-of select="NAME"/>
</xsl:element>
<xsl:element name="REFERENCES">
<xsl:apply-templates select="SCHEMA_OBJ"/>
</xsl:element>
<!-- end of SCOPE_CONSTRAINT_LIST_ITEM -->
</xsl:element>
</xsl:for-each>
<!-- end of SCOPE_CONSTRAINT_LIST -->
</xsl:element>
</xsl:if>
</xsl:template>
<xsl:template name="RowidConstraints">
<!-- *******************************************************************
Template: RowidConstraints
Current node: TABLE_T
******************************************************************** -->
<!-- PKREFs with reftyp=2
reftyp number not null /* REF type flag */
/* 0x01 = REF is scoped */
/* 0x02 = REF stored with rowid */
/* 0x04 = Primary key based ref */
/* 0x08 = Allow unscoped Primary key based ref */
-->
<xsl:if test="PKREF_LIST/PKREF_LIST_ITEM[(REFTYP mod 4)=2]">
<xsl:element name="ROWID_CONSTRAINT_LIST">
<xsl:for-each select="PKREF_LIST/PKREF_LIST_ITEM[(REFTYP mod 4)=2]">
<xsl:element name="ROWID_CONSTRAINT_LIST_ITEM">
<xsl:element name="COL">
<xsl:call-template name="ColOrAttrName">
<xsl:with-param name="ColNode" select="."/>
</xsl:call-template>
</xsl:element>
<xsl:if test="(REFTYP mod 16)>=8">
<xsl:element name="ALLOW_PRIMARY_KEY"/>
</xsl:if>
<!-- end of ROWID_CONSTRAINT_LIST_ITEM -->
</xsl:element>
</xsl:for-each>
<!-- end of ROWID_CONSTRAINT_LIST -->
</xsl:element>
</xsl:if>
</xsl:template>
<xsl:template name="SupplementalLogging">
<!-- *******************************************************************
Template: SupplementalLogging (implemented as a constraint
Current node: TABLE_T
******************************************************************** -->
<!--
supplemental log groups (w/ keys) (12),
supplemental log data (no keys) (14,15,16,17)
-->
<xsl:if test="CON1_LIST/CON1_LIST_ITEM[CONTYPE='12' or
CONTYPE='14' or
CONTYPE='15' or
CONTYPE='16' or
CONTYPE='17']">
<xsl:element name="SUPPLEMENTAL_LOGGING">
<!-- group list -->
<xsl:if test="CON1_LIST/CON1_LIST_ITEM[CONTYPE='12']">
<xsl:element name="GROUP_LIST">
<xsl:for-each select="CON1_LIST/CON1_LIST_ITEM[CONTYPE='12']">
<!-- sort is required to get reproducible results in lrgs -->
<xsl:sort select="CON_NUM" data-type="number"/>
<xsl:element name="GROUP_LIST_ITEM">
<xsl:element name="NAME">
<xsl:value-of select="NAME"/>
</xsl:element>
<xsl:call-template name="ConstraintColumnList">
<xsl:with-param name="ColListNode" select="COL_LIST"/>
</xsl:call-template>
<xsl:if test="(FLAGS mod 128)>=64">
<xsl:element name="ALWAYS"/>
</xsl:if>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:if>
<!-- id list -->
<xsl:if test="CON1_LIST/CON1_LIST_ITEM[CONTYPE='14' or
CONTYPE='15' or
CONTYPE='16' or
CONTYPE='17']">
<xsl:element name="ID_LIST">
<xsl:for-each select="CON1_LIST/CON1_LIST_ITEM[CONTYPE='14' or
CONTYPE='15' or
CONTYPE='16' or
CONTYPE='17']">
<!-- sort is required to get reproducible results in lrgs -->
<xsl:sort select="CON_NUM" data-type="number"/>
<xsl:element name="ID_LIST_ITEM">
<xsl:element name="COLUMNS">
<xsl:choose>
<xsl:when test="CONTYPE='14'">PRIMARY_KEY</xsl:when>
<xsl:when test="CONTYPE='15'">UNIQUE</xsl:when>
<xsl:when test="CONTYPE='16'">FOREIGN_KEY</xsl:when>
<xsl:when test="CONTYPE='17'">ALL</xsl:when>
</xsl:choose>
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:if>
</xsl:element>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
OHA YOOOO