You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by cb...@apache.org on 2008/08/08 01:21:58 UTC

svn commit: r683745 [11/22] - in /ibatis/trunk/java/ibatis-3: ./ ibatis-3-compat/ ibatis-3-compat/src/ ibatis-3-compat/src/main/ ibatis-3-compat/src/main/java/ ibatis-3-compat/src/main/java/com/ ibatis-3-compat/src/main/java/com/ibatis/ ibatis-3-compat...

Added: ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/DynamicAccount.xml
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/DynamicAccount.xml?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/DynamicAccount.xml (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/DynamicAccount.xml Thu Aug  7 16:21:46 2008
@@ -0,0 +1,727 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!DOCTYPE sqlMap
+    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
+    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
+
+<sqlMap namespace="Account">
+
+  <select id="dynamicIsParameterPresent"
+          parameterClass="integer"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <isParameterPresent>
+      where ACC_ID = #value#
+    </isParameterPresent>
+  </select>
+
+  <select id="dynamicIsNotEmpty"
+          parameterClass="string"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <isNotEmpty>
+      where ACC_FIRST_NAME = #value#
+    </isNotEmpty>
+  </select>
+
+  <select id="dynamicIsEqual"
+          parameterClass="string"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <isEqual compareValue="Clinton">
+      where ACC_FIRST_NAME = 'Clinton'
+    </isEqual>
+  </select>
+
+  <select id="dynamicIsGreater"
+          parameterClass="int"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <isGreaterThan compareValue="3">
+      where ACC_ID = 1
+    </isGreaterThan>
+  </select>
+
+  <select id="dynamicIsGreaterEqual"
+          parameterClass="int"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <isGreaterEqual compareValue="3">
+      where ACC_ID = 1
+    </isGreaterEqual>
+  </select>
+
+  <select id="dynamicIsLess"
+          parameterClass="int"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <isLessThan compareValue="3">
+      where ACC_ID = 1
+    </isLessThan>
+  </select>
+
+  <select id="dynamicIsLessEqual"
+          parameterClass="int"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <isLessEqual compareValue="3">
+      where ACC_ID = 1
+    </isLessEqual>
+  </select>
+
+  <select id="dynamicIsNotNull"
+          parameterClass="string"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <isNotNull>
+      where ACC_ID = 1
+    </isNotNull>
+  </select>
+
+  <select id="dynamicIsPropertyAvailable"
+          parameterClass="string"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <isPropertyAvailable property="id">
+      where ACC_ID = 1
+    </isPropertyAvailable>
+  </select>
+
+  <select id="dynamicSubst"
+          parameterClass="map"
+          resultClass="testdomain.Account">
+    <dynamic>
+      $statement$
+    </dynamic>
+  </select>
+
+  <select id="dynamicIterate"
+          parameterClass="list"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    WHERE ACC_ID IN
+    <iterate open="(" close=")" conjunction=",">
+      #[]#
+    </iterate>
+  </select>
+
+  <select id="dynamicIterateLiteral"
+          parameterClass="list"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    WHERE ACC_ID IN
+    <iterate open="(" close=")" conjunction=",">
+      $[]$
+    </iterate>
+  </select>
+
+  <select id="dynamicIterateInConditional"
+          parameterClass="list"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    WHERE ACC_ID IN
+    <iterate open="(" close=")" conjunction=",">
+      <isEqual property="[]" compareValue="1">
+        #[]#
+      </isEqual>
+      <isEqual property="[]" compareValue="3">
+        #[]#
+      </isEqual>
+    </iterate>
+  </select>
+
+  <select id="multiDynamicIterate"
+          parameterClass="list"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    WHERE ACC_ID IN
+    <iterate open="(" close=")" conjunction=",">
+      #[]#
+    </iterate>
+    AND ACC_ID IN
+    <iterate open="(" close=")" conjunction=",">
+      #[]#
+    </iterate>
+  </select>
+
+  <select id="multiDynamicIterateLiteral"
+          parameterClass="list"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    WHERE ACC_ID IN
+    <iterate open="(" close=")" conjunction=",">
+      #[]#
+    </iterate>
+    AND ACC_ID IN
+    <iterate open="(" close=")" conjunction=",">
+      #[]#
+    </iterate>
+  </select>
+
+  <select id="iterateNestedListProperty"
+          parameterClass="testdomain.Account"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    WHERE ACC_ID IN
+    <iterate open="(" close=")" conjunction="," property="accountList">
+      #accountList[].id#
+    </iterate>
+  </select>
+
+  <select id="iterateNestedListPropertyB"
+          parameterClass="testdomain.Account"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    WHERE ACC_ID IN
+    <iterate open="(" close=")" conjunction="," property="accountList">
+      #accountList[].id#
+      <isNotEqual prepend="," compareProperty="firstName" compareValue="test">
+        #id#
+      </isNotEqual>
+    </iterate>
+  </select>
+
+  <select id="iterateNestedMapListProperty"
+          parameterClass="map"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    WHERE ACC_ID IN
+    <iterate open="(" close=")" conjunction="," property="accountList">
+      #accountList[].id#
+    </iterate>
+  </select>
+
+  <select id="dynamicQueryByExample"
+          parameterClass="testdomain.Account"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <dynamic prepend="WHERE">
+      <isGreaterThan prepend="AND" property="id" compareValue="0">
+        ACC_ID = #id#
+      </isGreaterThan>
+      <isNotNull prepend="AND" property="ids" removeFirstPrepend="true">
+        ACC_ID in
+        <iterate prepend="YODUDE" property="ids" open="(" close=")" conjunction=",">
+          #ids[]#
+        </iterate>
+      </isNotNull>
+      <isNotEmpty prepend="AND" property="firstName">
+        ACC_FIRST_NAME = #firstName#
+      </isNotEmpty>
+      <isNotEmpty prepend="AND" property="lastName">
+        ACC_LAST_NAME = #lastName#
+      </isNotEmpty>
+      <isNotEmpty prepend="AND" property="emailAddress">
+        <isEqual property="emailAddress" compareValue="clinton">
+          ACC_EMAIL = 'clinton.begin@ibatis.com'
+        </isEqual>
+        <isNotEqual property="emailAddress" compareValue="clinton">
+          ACC_EMAIL = #emailAddress#
+        </isNotEqual>
+      </isNotEmpty>
+    </dynamic>
+  </select>
+
+  <select id="complexDynamicQueryByExample"
+          parameterClass="testdomain.Account"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <dynamic prepend="WHERE" open="(" close=")">
+      <isNotPropertyAvailable property="id" prepend="AND" open="(" close=")" removeFirstPrepend="true">
+        <isGreaterThan prepend="AND" property="id" compareValue="0">
+          ACC_ID = #id#
+        </isGreaterThan>
+      </isNotPropertyAvailable>
+      <isNotNull prepend="AND" property="ids" removeFirstPrepend="false">
+        ACC_ID in
+        <iterate property="ids" open="(" close=")" conjunction=",">
+          $ids[]$
+        </iterate>
+      </isNotNull>
+      <isPropertyAvailable property="lastName" prepend="AND" open="(" close=")" removeFirstPrepend="true">
+        <isNotEmpty prepend="AND" property="firstName" removeFirstPrepend="false">
+          ACC_FIRST_NAME = #firstName#
+        </isNotEmpty>
+      </isPropertyAvailable>
+      <isPropertyAvailable property="lastName" prepend="AND" open="(" close=")" removeFirstPrepend="true">
+        <isNotEmpty prepend="AND" property="lastName" removeFirstPrepend="false">
+          ACC_LAST_NAME = #lastName#
+        </isNotEmpty>
+      </isPropertyAvailable>
+      <isNotEmpty prepend="AND" property="emailAddress">
+        <isEqual property="emailAddress" compareValue="clinton">
+          ACC_EMAIL = 'clinton.begin@ibatis.com'
+        </isEqual>
+        <isNotEqual property="emailAddress" compareValue="clinton">
+          ACC_EMAIL = #emailAddress#
+        </isNotEqual>
+      </isNotEmpty>
+    </dynamic>
+  </select>
+
+  <select id="complexDynamicQueryByExampleLiteral"
+          parameterClass="testdomain.Account"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <dynamic prepend="WHERE" open="(" close=")">
+      <isNotPropertyAvailable property="id" prepend="AND" open="(" close=")" removeFirstPrepend="true">
+        <isGreaterThan prepend="AND" property="id" compareValue="0">
+          ACC_ID = #id#
+        </isGreaterThan>
+      </isNotPropertyAvailable>
+      <isNotNull prepend="AND" property="ids" removeFirstPrepend="false">
+        ACC_ID in
+        <iterate property="ids" open="(" close=")" conjunction=",">
+          #ids[]#
+        </iterate>
+      </isNotNull>
+      <isPropertyAvailable property="lastName" prepend="AND" open="(" close=")" removeFirstPrepend="true">
+        <isNotEmpty prepend="AND" property="firstName" removeFirstPrepend="false">
+          ACC_FIRST_NAME = #firstName#
+        </isNotEmpty>
+      </isPropertyAvailable>
+      <isPropertyAvailable property="lastName" prepend="AND" open="(" close=")" removeFirstPrepend="true">
+        <isNotEmpty prepend="AND" property="lastName" removeFirstPrepend="false">
+          ACC_LAST_NAME = #lastName#
+        </isNotEmpty>
+      </isPropertyAvailable>
+      <isNotEmpty prepend="AND" property="emailAddress">
+        <isEqual property="emailAddress" compareValue="clinton">
+          ACC_EMAIL = 'clinton.begin@ibatis.com'
+        </isEqual>
+        <isNotEqual property="emailAddress" compareValue="clinton">
+          ACC_EMAIL = #emailAddress#
+        </isNotEqual>
+      </isNotEmpty>
+    </dynamic>
+  </select>
+
+  <select id="dynamicQueryByExample2"
+          parameterClass="testdomain.Account"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <dynamic prepend="WHERE">
+      <iterate property="ids" conjunction="OR">
+        <isNotNull property="age">
+          ACC_ID = #ids[]#
+        </isNotNull>
+      </iterate>
+    </dynamic>
+  </select>
+
+  <select id="dynamicQueryByExample2Literal"
+          parameterClass="testdomain.Account"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <dynamic prepend="WHERE">
+      <iterate property="ids" conjunction="OR">
+        <isNotNull property="age">
+          ACC_ID = $ids[]$
+        </isNotNull>
+      </iterate>
+    </dynamic>
+  </select>
+  <!--
+  issue IBATIS-42 test
+  include the following code in the same place where
+  'ACC_ID = #ids[]#' exists in the dynamicQueryByExample2 statement
+  <isNotNull property="age">
+    ACC_ID = #ids[]#
+  </isNotNull>
+  -->
+
+  <select id="dynamicIterateWithPrepend1"
+          parameterClass="list"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <dynamic prepend="where">
+      ACC_ID IN
+      <iterate open="(" close=")" conjunction=",">
+        #[]#
+      </iterate>
+    </dynamic>
+  </select>
+
+  <select id="dynamicIterateWithPrepend2"
+          parameterClass="list"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <dynamic prepend="where">
+      <iterate open="(" close=")" conjunction="OR">
+        ACC_ID = #[]#
+      </iterate>
+    </dynamic>
+  </select>
+
+  <select id="dynamicIterateWithPrepend2b"
+          parameterClass="list"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <dynamic prepend="where">
+      <iterate open="(" close=")" conjunction="OR">
+        ACC_ID = #[].id#
+      </iterate>
+    </dynamic>
+  </select>
+
+  <select id="dynamicIterateWithPrepend2c"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <dynamic prepend="where">
+      <iterate property="myList" open="(" close=")" conjunction="OR">
+        ACC_ID = #myList[].id#
+      </iterate>
+    </dynamic>
+  </select>
+
+  <select id="dynamicIterateWithPrepend2d"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <dynamic prepend="where">
+      <iterate property="myList" open="(" close=")" conjunction="OR">
+        <isEqual property="myList[]" compareValue="1">
+          ACC_ID = #myList[]#
+        </isEqual>
+        <isEqual property="myList[]" compareValue="3">
+          ACC_ID = #myList[]#
+        </isEqual>
+      </iterate>
+    </dynamic>
+  </select>
+
+  <select id="dynamicIterateWithPrepend2e"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <dynamic prepend="where">
+      <iterate property="myArray" open="(" close=")" conjunction="OR">
+        <isEqual property="myArray[]" compareValue="1">
+          ACC_ID = #myArray[]#
+        </isEqual>
+        <isEqual property="myArray[]" compareValue="3">
+          ACC_ID = #myArray[]#
+        </isEqual>
+      </iterate>
+    </dynamic>
+  </select>
+
+  <select id="dynamicIterateWithPrepend2f"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <dynamic prepend="where">
+      <iterate property="intArray" open="(" close=")" conjunction="OR">
+        <isEqual property="intArray[]" compareValue="1">
+          ACC_ID = #intArray[]#
+        </isEqual>
+        <isEqual property="intArray[]" compareValue="3">
+          ACC_ID = #intArray[]#
+        </isEqual>
+      </iterate>
+    </dynamic>
+  </select>
+
+  <select id="dynamicIterateWithPrepend3"
+          parameterClass="list"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <dynamic prepend="where">
+      <isParameterPresent prepend="BLAH!">
+        <iterate open="(" close=")" conjunction="OR">
+          ACC_ID = #[]#
+        </iterate>
+      </isParameterPresent>
+    </dynamic>
+  </select>
+
+  <sql id="includeComplex">
+    <dynamic prepend="where">
+      <isParameterPresent>
+        <isNotEmpty prepend="and" property="id">
+          ACC_ID = #id#
+        </isNotEmpty>
+        <isNotEmpty prepend="and" property="firstName">
+          ACC_FIRST_NAME = #firstName#
+        </isNotEmpty>
+        <isNotEmpty prepend="and" property="lastName">
+          ACC_LAST_NAME = #lastName#
+        </isNotEmpty>
+      </isParameterPresent>
+    </dynamic>
+  </sql>
+
+  <select id="dynamicWithPrepend"
+          parameterClass="testdomain.Account"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <include refid="includeComplex"/>
+  </select>
+
+  <select id="dynamicWithTwoDynamicElements"
+          parameterClass="testdomain.Account"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <dynamic prepend="where">
+      <isNotEmpty prepend="BLAH!" property="id">
+        ACC_ID = #id#
+      </isNotEmpty>
+    </dynamic>
+    <dynamic prepend="and">
+      <isNotEmpty prepend="BLAH!" property="firstName">
+        ACC_FIRST_NAME = #firstName#
+      </isNotEmpty>
+      <isNotEmpty prepend="and" property="lastName">
+        ACC_LAST_NAME = #lastName#
+      </isNotEmpty>
+    </dynamic>
+  </select>
+
+  <select id="complexDynamicStatement" cacheModel="account-cache" resultClass="testdomain.Account"
+          parameterClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <dynamic prepend="WHERE">
+      <isNotNull prepend="AND" property="firstName">
+        (ACC_FIRST_NAME = #firstName#
+        <isNotNull prepend="OR" property="lastName">
+          ACC_LAST_NAME = #lastName#
+        </isNotNull>
+        )
+      </isNotNull>
+      <isNotNull prepend="AND" property="emailAddress">
+        ACC_EMAIL like #emailAddress#
+      </isNotNull>
+      <isGreaterThan prepend="AND" property="id" compareValue="0">
+        ACC_ID = #id#
+      </isGreaterThan>
+    </dynamic>
+    order by ACC_LAST_NAME
+  </select>
+
+  <select id="iterateListInMap"
+          parameterClass="map"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    WHERE 1 = 1
+    <dynamic>
+      <iterate open="AND ACC_ID IN (" close=")" conjunction="," property="paramList">
+        #paramList[]#
+      </iterate>
+    </dynamic>
+  </select>
+
+  <select id="iterateListDirect"
+          parameterClass="list"
+          resultClass="testdomain.Account">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    WHERE 1 = 1
+    <dynamic>
+      <iterate open="AND ACC_ID IN (" close=")" conjunction=",">
+        #[]#
+      </iterate>
+    </dynamic>
+  </select>
+
+  <select id="testRemappableResults" parameterClass="int" resultClass="testdomain.Account" remapResults="true">
+    select
+    <isNotEqual compareValue="77">
+      ACC_ID as id,
+    </isNotEqual>
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    <isEqual compareValue="77">
+      where ACC_ID = 2
+    </isEqual>
+    <isNotEqual compareValue="77">
+      where ACC_ID = #value#
+    </isNotEqual>
+  </select>
+
+  <select id="selectIfPropertyAvailable" parameterClass="java.util.HashMap" resultClass="java.util.HashMap">
+    SELECT * FROM ACCOUNT
+    <dynamic prepend="WHERE">
+      <isPropertyAvailable prepend="AND" property="xid">
+        ACC_ID = #xid#
+      </isPropertyAvailable>
+      <isPropertyAvailable prepend="AND" property="name">
+        ACC_FIRST_NAME = #name#
+      </isPropertyAvailable>
+    </dynamic>
+    ORDER BY ACC_ID
+  </select>
+
+</sqlMap>
\ No newline at end of file

Added: ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/Jira.xml
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/Jira.xml?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/Jira.xml (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/Jira.xml Thu Aug  7 16:21:46 2008
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!DOCTYPE sqlMap
+    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
+    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
+
+<sqlMap>
+
+  <resultMap id="jira260GroupedResult" class="testdomain.ArticleIndex" groupBy="categoryTitle">
+    <result property="categoryTitle" column="category_title"/>
+    <result property="topics" resultMap="topicResult"/>
+  </resultMap>
+
+  <resultMap id="topicResult" class="testdomain.Topic" groupBy="topicTitle">
+    <result property="topicTitle" column="topic_title"/>
+    <result property="descriptionList" resultMap="descriptionResult"/>
+  </resultMap>
+
+  <resultMap id="descriptionResult" class="testdomain.TopicDescription">
+    <result property="description" column="topic_description"/>
+  </resultMap>
+
+  <resultMap id="jira260FlatResult" class="testdomain.ArticleIndexDenorm">
+    <result property="categoryTitle" column="category_title"/>
+    <result property="topicTitle" column="topic_title"/>
+    <result property="description" column="topic_description"/>
+  </resultMap>
+
+  <sql id="Jira260Query">
+    SELECT CATEGORY_TITLE,
+    TOPIC_TITLE,
+    TOPIC_DESCRIPTION
+    FROM ARTICLE_INDEX
+    ORDER BY CATEGORY_TITLE, TOPIC_TITLE
+  </sql>
+
+  <!--
+      The error actually described in JIRA-260
+  -->
+  <select id="getJira260GroupedResult" resultMap="jira260GroupedResult">
+    <include refid="Jira260Query"/>
+  </select>
+
+  <select id="getJira260FlatResult" resultMap="jira260FlatResult">
+    <include refid="Jira260Query"/>
+  </select>
+
+</sqlMap>
\ No newline at end of file

Added: ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/LineItem.xml
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/LineItem.xml?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/LineItem.xml (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/LineItem.xml Thu Aug  7 16:21:46 2008
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!DOCTYPE sqlMap
+    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
+    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
+
+<sqlMap>
+
+  <resultMap id="missingParamCheckA" class="testdomain.LineItem">
+    <result property="id" column="id"/>
+    <result property="orderId" column="orderId"/>
+    <result property="itemCode" column="itemCode"/>
+  </resultMap>
+
+  <resultMap id="missingParamCheckB" class="testdomain.LineItem" extends="missingParamCheckA">
+    <result property="quantity" column="quantity"/>
+    <result property="price" column="price"/>
+  </resultMap>
+
+  <select id="getAllLineItemProps" parameterClass="int" resultMap="missingParamCheckA">
+    select
+    LIN_ID as id,
+    LIN_ORD_ID as orderId,
+    LIN_ITM_CODE as itemCode
+    from LINE_ITEM where LIN_ORD_ID = #value#
+  </select>
+
+  <select id="getSomeLineItemProps" parameterClass="int" resultMap="missingParamCheckB">
+    select
+    LIN_ID as id,
+    LIN_ORD_ID as orderId,
+
+    LIN_QUANTITY as quantity,
+    LIN_PRICE as price
+    from LINE_ITEM where LIN_ORD_ID = #value#
+  </select>
+
+
+  <select id="getLineItemsForOrder"
+          parameterClass="java.lang.Integer"
+          resultClass="testdomain.LineItem">
+    select
+    LIN_ID as id,
+    LIN_ORD_ID as orderId,
+    LIN_ITM_CODE as itemCode,
+    LIN_QUANTITY as quantity,
+    LIN_PRICE as price
+    from LINE_ITEM where LIN_ORD_ID = #value#
+  </select>
+
+  <insert id="insertLineItem" parameterClass="testdomain.LineItem">
+    <selectKey resultClass="int" keyProperty="id" type="post">
+      select 99 from LINE_ITEM where LIN_ID = 1 and LIN_ORD_ID=1
+    </selectKey>
+    insert into LINE_ITEM
+    (LIN_ID, LIN_ORD_ID, LIN_ITM_CODE, LIN_QUANTITY, LIN_PRICE)
+    values
+    (#id#, #orderId#, #itemCode#, #quantity#, #price#)
+  </insert>
+
+  <insert id="insertLineItemOrDie" parameterClass="testdomain.LineItem">
+    <selectKey resultClass="int" keyProperty="id" type="post">
+      select 99 from LINE_ITEM where LIN_ID = 1 and LIN_ORD_ID=1
+    </selectKey>
+    insert into LINE_ITEM_LOL
+    (LIN_ID, LIN_ORD_ID, LIN_ITM_CODE, LIN_QUANTITY, LIN_PRICE)
+    values
+    (#id#, #orderId#, #itemCode#, #quantity#, #price#)
+  </insert>
+
+  <insert id="insertLineItemPreKey" parameterClass="testdomain.LineItem">
+    <selectKey resultClass="int" keyProperty="id">
+      select 99 from LINE_ITEM where LIN_ID = 1 and LIN_ORD_ID=1
+    </selectKey>
+    insert into LINE_ITEM
+    (LIN_ID, LIN_ORD_ID, LIN_ITM_CODE, LIN_QUANTITY, LIN_PRICE)
+    values
+    (#id#, #orderId#, #itemCode#, #quantity#, #price#)
+  </insert>
+
+  <insert id="insertLineItemNoKey" parameterClass="testdomain.LineItem">
+    insert into LINE_ITEM
+    (LIN_ID, LIN_ORD_ID, LIN_ITM_CODE, LIN_QUANTITY, LIN_PRICE)
+    values
+    (#id#, #orderId#, #itemCode#, #quantity#, #price#)
+  </insert>
+
+  <select id="getSpecificLineItem"
+          parameterClass="java.util.HashMap"
+          resultClass="testdomain.LineItem">
+    select
+    LIN_ID as id,
+    LIN_ORD_ID as orderId,
+    LIN_ITM_CODE as itemCode,
+    LIN_QUANTITY as quantity,
+    LIN_PRICE as price
+    from LINE_ITEM
+    where LIN_ORD_ID = #orderId#
+    and LIN_ID = #lineId#
+  </select>
+
+  <select id="getDynSpecificLineItem"
+          parameterClass="java.util.HashMap"
+          resultClass="testdomain.LineItem">
+    select
+    LIN_ID as id,
+    LIN_ORD_ID as orderId,
+    LIN_ITM_CODE as itemCode,
+    LIN_QUANTITY as quantity,
+    LIN_PRICE as price
+    from LINE_ITEM
+    where LIN_ORD_ID = #orderId#
+    <dynamic>
+      <isNotNull property="lineId">
+        and LIN_ID = #lineId#
+      </isNotNull>
+    </dynamic>
+  </select>
+
+</sqlMap>
\ No newline at end of file

Added: ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/NestedIterateStatements.xml
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/NestedIterateStatements.xml?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/NestedIterateStatements.xml (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/NestedIterateStatements.xml Thu Aug  7 16:21:46 2008
@@ -0,0 +1,442 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
+<sqlMap namespace="NestedIterateStatements">
+
+  <resultMap id="personResult" class="testdomain.Person">
+    <result property="id" column="id"/>
+    <result property="firstName" column="first_name"/>
+    <result property="lastName" column="last_name"/>
+  </resultMap>
+
+  <select id="NestedIterateTest1" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="idList" conjunction="or">
+        id = #idList[]#
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <select id="NestedIterateTest2" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="idList" conjunction="or">
+        <isEqual property="idList[]" compareValue="4">
+          id = #idList[]#
+        </isEqual>
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <select id="NestedIterateTest3" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="idList" conjunction="or">
+        <isNotEqual property="idList[]" compareValue="4">
+          id = #idList[]#
+        </isNotEqual>
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <select id="NestedIterateTest4" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="idList" conjunction="or">
+        <isGreaterThan property="idList[]" compareValue="4">
+          id = #idList[]#
+        </isGreaterThan>
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <select id="NestedIterateTest5" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="idList" conjunction="or">
+        <isGreaterEqual property="idList[]" compareValue="4">
+          id = #idList[]#
+        </isGreaterEqual>
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <select id="NestedIterateTest6" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="idList" conjunction="or">
+        <isLessThan property="idList[]" compareValue="4">
+          id = #idList[]#
+        </isLessThan>
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <select id="NestedIterateTest7" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="idList" conjunction="or">
+        <isLessEqual property="idList[]" compareValue="4">
+          id = #idList[]#
+        </isLessEqual>
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <!-- try iterating over two properties -->
+  <select id="NestedIterateTest8" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="lastNames" conjunction="or">
+        <iterate property="firstNames" conjunction="or">
+          first_name = #firstNames[]# and last_name = #lastNames[]#
+        </iterate>
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <!-- try nested iterates -->
+  <select id="NestedIterateTest9" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="orConditions" conjunction="or">
+        (
+        <iterate property="orConditions[].conditions" conjunction="and">
+          $orConditions[].conditions[].condition$ #orConditions[].conditions[].value#
+        </iterate>
+        )
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <!-- This test makes sure that removeFirstPrepend works for every iteration -->
+  <select id="NestedIterateTest9a" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="orConditions" conjunction="or" removeFirstPrepend="iterate">
+        (
+        <iterate prepend="and" property="orConditions[].conditions" conjunction="and">
+          $orConditions[].conditions[].condition$ #orConditions[].conditions[].value#
+        </iterate>
+        )
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <select id="NestedIterateTest10" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="idList" open="(" close=")" removeFirstPrepend="true">
+        <isEqual property="idList[]" compareValue="4" prepend="or">
+          id = #idList[]#
+        </isEqual>
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <select id="NestedIterateTest11" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="idList" removeFirstPrepend="true">
+        <isNotEqual property="idList[]" compareValue="4" prepend="or">
+          id = #idList[]#
+        </isNotEqual>
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <select id="NestedIterateTest12" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="idList" removeFirstPrepend="true">
+        <isGreaterThan property="idList[]" compareValue="4" prepend="or">
+          id = #idList[]#
+        </isGreaterThan>
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <select id="NestedIterateTest13" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="idList" removeFirstPrepend="true">
+        <isGreaterEqual property="idList[]" compareValue="4" prepend="or">
+          id = #idList[]#
+        </isGreaterEqual>
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <select id="NestedIterateTest14" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="idList" removeFirstPrepend="true">
+        <isLessThan property="idList[]" compareValue="4" prepend="or">
+          id = #idList[]#
+        </isLessThan>
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <select id="NestedIterateTest15" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="idList" removeFirstPrepend="true">
+        <isLessEqual property="idList[]" compareValue="4" prepend="or">
+          id = #idList[]#
+        </isLessEqual>
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <!-- test for IBATIS-293 written in the form of 2-7 above -->
+  <select id="NestedIterateTest16" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="orConditions" conjunction="or">
+        (
+        <iterate property="orConditions[].conditions" conjunction="and">
+          <isEqual property="orConditions[].conditions[].include" compareValue="true">
+            $orConditions[].conditions[].condition$ #orConditions[].conditions[].value#
+          </isEqual>
+        </iterate>
+        )
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <!-- test for IBATIS-293 written in the form of 9-15 above -->
+  <select id="NestedIterateTest17" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="orConditions" conjunction="or">
+        (
+        <iterate property="orConditions[].conditions" removeFirstPrepend="true">
+          <isEqual property="orConditions[].conditions[].include" compareValue="true" prepend="and">
+            $orConditions[].conditions[].condition$ #orConditions[].conditions[].value#
+          </isEqual>
+        </iterate>
+        )
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <!-- test for IBATIS-293 written in the form of 9-15 above -->
+  <select id="NestedIterateTest18" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="orConditions" conjunction="or">
+        (
+        <iterate property="orConditions[].conditions" removeFirstPrepend="true">
+          <isNotPropertyAvailable property="orConditions[].conditions[].fred" prepend="and">
+            $orConditions[].conditions[].condition$ #orConditions[].conditions[].value#
+          </isNotPropertyAvailable>
+        </iterate>
+        )
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <!-- test for IBATIS-293 written in the form of 9-15 above -->
+  <select id="NestedIterateTest19" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="orConditions" conjunction="or">
+        (
+        <iterate property="orConditions[].conditions" removeFirstPrepend="true">
+          <isNotNull property="orConditions[].conditions[].include" prepend="and">
+            $orConditions[].conditions[].condition$ #orConditions[].conditions[].value#
+          </isNotNull>
+        </iterate>
+        )
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <!-- test for IBATIS-293 written in the form of 9-15 above -->
+  <select id="NestedIterateTest20" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <dynamic prepend="where">
+      <iterate property="orConditions" conjunction="or">
+        (
+        <iterate property="orConditions[].conditions" removeFirstPrepend="true">
+          <isNotEmpty property="orConditions[].conditions[].include" prepend="and">
+            $orConditions[].conditions[].condition$ #orConditions[].conditions[].value#
+          </isNotEmpty>
+        </iterate>
+        )
+      </iterate>
+    </dynamic>
+    order by id
+  </select>
+
+  <!-- test the open, close, prepend attributes when no elements satisfy -->
+  <select id="NestedIterateTest21" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <iterate property="idList" conjunction="or" prepend="where" open="(" close=")">
+      <isEqual property="idList[]" compareValue="55">
+        id = #idList[]#
+      </isEqual>
+    </iterate>
+    order by id
+  </select>
+
+  <!-- test the open, close, prepend attributes when the first element doesn't satisfy -->
+  <select id="NestedIterateTest22" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <iterate property="idList" conjunction="or" prepend="where" open="(" close=")">
+      <isEqual property="idList[]" compareValue="4">
+        id = #idList[]#
+      </isEqual>
+    </iterate>
+    order by id
+  </select>
+
+  <!-- test the open, close, prepend attributes when only the first element satisfies -->
+  <select id="NestedIterateTest23" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <iterate property="idList" conjunction="or" prepend="where" open="(" close=")">
+      <isEqual property="idList[]" compareValue="1">
+        id = #idList[]#
+      </isEqual>
+    </iterate>
+    order by id
+  </select>
+
+  <!-- test the open, close, prepend attributes when only the last element satisfies -->
+  <select id="NestedIterateTest24" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <iterate property="idList" conjunction="or" prepend="where" open="(" close=")">
+      <isEqual property="idList[]" compareValue="9">
+        id = #idList[]#
+      </isEqual>
+    </iterate>
+    order by id
+  </select>
+
+
+  <!-- test the open, close, prepend attributes when more than one element satisfies -->
+  <select id="NestedIterateTest25" resultMap="personResult" parameterClass="testdomain.NestedIterateParameterObject">
+    select id, first_name, last_name
+    from person
+    <iterate property="idList" conjunction="or" prepend="where" open="(" close=")">
+      <isLessThan property="idList[]" compareValue="4">
+        id = #idList[]#
+      </isLessThan>
+    </iterate>
+    order by id
+  </select>
+
+  <!-- test nested map -->
+  <select id="NestedIterateTest26" resultMap="personResult" parameterClass="map">
+    select id, first_name, last_name
+    from person
+    <iterate property="po.idList" conjunction="or" prepend="where" open="(" close=")">
+      <isLessThan property="po.idList[]" compareValue="4">
+        id = #po.idList[]#
+      </isLessThan>
+    </iterate>
+    order by id
+  </select>
+
+  <!-- test deeper combo of list maps nesting -->
+  <select id="NestedIterateTest27" resultMap="personResult" parameterClass="map">
+    select id, first_name, last_name
+    from person
+    <iterate property="firstList">
+      <iterate property="firstList[].po.idList" conjunction="or" prepend="where" open="(" close=")">
+        <isLessThan property="firstList[].po.idList[]" compareValue="4">
+          id = #firstList[].po.idList[]#
+        </isLessThan>
+      </iterate>
+    </iterate>
+    order by id
+  </select>
+
+  <!-- test nested object -->
+  <select id="NestedIterateTest28" resultMap="personResult" parameterClass="testdomain.SimpleNestedParameterObject">
+    select id, first_name, last_name
+    from person
+    <iterate property="nestedIterateParameterObject.idList" conjunction="or" prepend="where" open="(" close=")">
+      <isLessThan property="nestedIterateParameterObject.idList[]" compareValue="4">
+        id = #nestedIterateParameterObject.idList[]#
+      </isLessThan>
+    </iterate>
+    order by id
+  </select>
+
+  <!-- test deeper combo of list bean nesting -->
+  <select id="NestedIterateTest29" resultMap="personResult" parameterClass="testdomain.SimpleNestedParameterObject">
+    select id, first_name, last_name
+    from person
+    <iterate property="nestedList">
+      <iterate property="nestedList[].nestedIterateParameterObject.idList" conjunction="or" prepend="where" open="("
+               close=")">
+        <isLessThan property="nestedList[].nestedIterateParameterObject.idList[]" compareValue="4">
+          id = #nestedList[].nestedIterateParameterObject.idList[]#
+        </isLessThan>
+      </iterate>
+    </iterate>
+    order by id
+  </select>
+
+  <select id="NestedIterateTest30" parameterClass="testdomain.Category" resultClass="testdomain.Product">
+    SELECT * FROM product WHERE productId=
+    <iterate property="parentCategory.productList">
+      <isEqual property="parentCategory.productList[].productId" compareValue="FI-SW-01">
+        #parentCategory.productList[].productId#
+      </isEqual>
+      <isEqual property="parentCategory.productList[].productId" compareValue="NOTHING">
+        #parentCategory.productList[].productId#
+      </isEqual>
+      <isEqual property="parentCategory.productList[].productId" compareValue="NOTHINGAGAIN">
+        #parentCategory.productList[].productId#
+      </isEqual>
+    </iterate>
+  </select>
+</sqlMap>

Added: ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/OracleConfig.properties
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/OracleConfig.properties?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/OracleConfig.properties (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/OracleConfig.properties Thu Aug  7 16:21:46 2008
@@ -0,0 +1,4 @@
+driver=oracle.jdbc.driver.OracleDriver
+url=jdbc:oracle:thin:@192.168.1.101:1521:oracle1
+username=jpetstore
+password=test

Added: ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/OracleProc.xml
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/OracleProc.xml?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/OracleProc.xml (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/OracleProc.xml Thu Aug  7 16:21:46 2008
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!DOCTYPE sqlMap
+    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
+    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
+
+<sqlMap>
+
+  <parameterMap id="swapParameters" class="map">
+    <parameter property="email1" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
+    <parameter property="email2" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
+    <parameter property="status" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
+  </parameterMap>
+
+  <procedure id="swapEmailAddresses" parameterMap="swapParameters">
+    {call swap_email_address (?, ?, ?)}
+  </procedure>
+
+  <parameterMap id="swapParametersUsingBean" class="testdomain.ProcBean">
+    <parameter property="email1" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
+    <parameter property="email2" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
+    <parameter property="status" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
+  </parameterMap>
+
+  <procedure id="swapEmailAddressesUsingBean" parameterMap="swapParametersUsingBean">
+    {call swap_email_address (?, ?, ?)}
+  </procedure>
+
+  <procedure id="noParamProc" resultClass="string">
+    {call no_param_proc ()}
+  </procedure>
+
+</sqlMap>
\ No newline at end of file

Added: ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/Order.xml
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/Order.xml?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/Order.xml (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/Order.xml Thu Aug  7 16:21:46 2008
@@ -0,0 +1,257 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!DOCTYPE sqlMap
+    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
+    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
+
+<sqlMap>
+
+  <cacheModel id="order-cache" type="MEMORY">
+    <flushInterval hours="24"/>
+  </cacheModel>
+
+  <typeAlias alias="order" type="testdomain.Order"/>
+
+  <resultMap id="credit-card-result" class="java.lang.String">
+    <result property="value" column="ORD_CARD_NUMBER"/>
+  </resultMap>
+
+  <resultMap id="lite-order-map-result" class="java.util.HashMap">
+    <result property="id" column="ORD_ID"/>
+    <result property="date" column="ORD_DATE"/>
+    <result property="cardExpiry" column="ORD_CARD_EXPIRY"/>
+    <result property="cardType" column="ORD_CARD_TYPE"/>
+    <result property="cardNumber" column="ORD_CARD_NUMBER"/>
+    <result property="street" column="ORD_STREET"/>
+    <result property="city" column="ORD_CITY"/>
+    <result property="province" column="ORD_PROVINCE"/>
+    <result property="postalCode" column="ORD_POSTAL_CODE"/>
+  </resultMap>
+
+  <resultMap id="lite-order-result-by-name" class="order">
+    <result property="id" column="ORD_ID"/>
+    <result property="date" column="ORD_DATE"/>
+    <result property="cardExpiry" column="ORD_CARD_EXPIRY"/>
+    <result property="cardType" column="ORD_CARD_TYPE"/>
+    <result property="cardNumber" column="ORD_CARD_NUMBER"/>
+    <result property="street" column="ORD_STREET"/>
+    <result property="city" column="ORD_CITY"/>
+    <result property="province" column="ORD_PROVINCE"/>
+    <result property="postalCode" column="ORD_POSTAL_CODE"/>
+  </resultMap>
+
+  <resultMap id="lite-order-result-by-index" class="order">
+    <result property="id" column="ORD_ID"/>
+    <result property="date" column="ORD_DATE"/>
+    <result property="cardExpiry" column="ORD_CARD_EXPIRY"/>
+    <result property="cardType" column="ORD_CARD_TYPE"/>
+    <result property="cardNumber" column="ORD_CARD_NUMBER"/>
+    <result property="street" column="ORD_STREET"/>
+    <result property="city" column="ORD_CITY"/>
+    <result property="province" column="ORD_PROVINCE"/>
+    <result property="postalCode" column="ORD_POSTAL_CODE"/>
+  </resultMap>
+
+  <resultMap id="order-with-account-result" class="order">
+    <result property="id" column="ORD_ID"/>
+    <result property="date" column="ORD_DATE"/>
+    <result property="cardExpiry" column="ORD_CARD_EXPIRY"/>
+    <result property="cardType" column="ORD_CARD_TYPE"/>
+    <result property="cardNumber" column="ORD_CARD_NUMBER"/>
+    <result property="street" column="ORD_STREET"/>
+    <result property="city" column="ORD_CITY"/>
+    <result property="province" column="ORD_PROVINCE"/>
+    <result property="postalCode" column="ORD_POSTAL_CODE"/>
+    <result property="account" column="ORD_ACC_ID" select="getAccountViaColumnName"/>
+  </resultMap>
+
+  <resultMap id="order-with-lines-result" class="order"
+             extends="lite-order-result-by-name">
+    <result property="lineItems" column="ORD_ID" select="getLineItemsForOrder"/>
+  </resultMap>
+
+  <resultMap id="lineItemNestedResult" class="testdomain.LineItem">
+    <result column="LIN_ID" property="id"/>
+    <result column="LIN_ORD_ID" property="orderId"/>
+    <result column="LIN_ITM_CODE" property="itemCode"/>
+    <result column="LIN_QUANTITY" property="quantity"/>
+    <result column="LIN_PRICE" property="price"/>
+  </resultMap>
+
+  <resultMap id="orderResultWithNestedMaps" class="order"
+             extends="lite-order-result-by-name" groupBy="id">
+    <result property="account" resultMap="Account.account-result"/>
+    <result property="lineItems" resultMap="lineItemNestedResult"/>
+  </resultMap>
+
+  <resultMap id="order-with-lines-array" class="order"
+             extends="lite-order-result-by-name">
+    <result property="lineItemArray" column="ORD_ID" select="getLineItemsForOrder"/>
+  </resultMap>
+
+  <resultMap id="order-with-collection-result" class="order">
+    <result property="id" column="ORD_ID"/>
+    <result property="date" column="ORD_DATE"/>
+    <result property="cardExpiry" column="ORD_CARD_EXPIRY"/>
+    <result property="cardType" column="ORD_CARD_TYPE"/>
+    <result property="cardNumber" column="ORD_CARD_NUMBER"/>
+    <result property="street" column="ORD_STREET"/>
+    <result property="city" column="ORD_CITY"/>
+    <result property="province" column="ORD_PROVINCE"/>
+    <result property="postalCode" column="ORD_POSTAL_CODE"/>
+    <result property="lineItems" column="ORD_ID" select="getLineItemsForOrder"/>
+  </resultMap>
+
+  <resultMap id="order-with-types-result" class="order">
+    <result property="id" jdbcType="NUMERIC" column="ORD_ID"/>
+    <result property="date" jdbcType="TIMESTAMP" column="ORD_DATE"/>
+    <result property="cardExpiry" jdbcType="VARCHAR" column="ORD_CARD_EXPIRY"/>
+    <result property="cardType" jdbcType="VARCHAR" column="ORD_CARD_TYPE"/>
+    <result property="cardNumber" jdbcType="VARCHAR" column="ORD_CARD_NUMBER"/>
+    <result property="street" jdbcType="VARCHAR" column="ORD_STREET"/>
+    <result property="city" jdbcType="VARCHAR" column="ORD_CITY"/>
+    <result property="province" jdbcType="VARCHAR" column="ORD_PROVINCE"/>
+    <result property="postalCode" jdbcType="VARCHAR" column="ORD_POSTAL_CODE"/>
+  </resultMap>
+
+  <resultMap id="order-with-favourite-line-item" class="order">
+    <result property="id" jdbcType="NUMERIC" column="ORD_ID"/>
+    <result property="date" jdbcType="TIMESTAMP" column="ORD_DATE"/>
+    <result property="cardExpiry" jdbcType="VARCHAR" column="ORD_CARD_EXPIRY"/>
+    <result property="cardType" jdbcType="VARCHAR" column="ORD_CARD_TYPE"/>
+    <result property="cardNumber" jdbcType="VARCHAR" column="ORD_CARD_NUMBER"/>
+    <result property="street" jdbcType="VARCHAR" column="ORD_STREET"/>
+    <result property="city" jdbcType="VARCHAR" column="ORD_CITY"/>
+    <result property="province" jdbcType="VARCHAR" column="ORD_PROVINCE"/>
+    <result property="postalCode" jdbcType="VARCHAR" column="ORD_POSTAL_CODE"/>
+    <result property="favouriteLineItem"
+            column="{orderId=ORD_ID,lineId=ORD_FAVOURITE_LINE}"
+            select="getSpecificLineItem"/>
+  </resultMap>
+
+  <resultMap id="order-with-dyn-favourite-line-item" class="order">
+    <result property="id" jdbcType="NUMERIC" column="ORD_ID"/>
+    <result property="date" jdbcType="TIMESTAMP" column="ORD_DATE"/>
+    <result property="cardExpiry" jdbcType="VARCHAR" column="ORD_CARD_EXPIRY"/>
+    <result property="cardType" jdbcType="VARCHAR" column="ORD_CARD_TYPE"/>
+    <result property="cardNumber" jdbcType="VARCHAR" column="ORD_CARD_NUMBER"/>
+    <result property="street" jdbcType="VARCHAR" column="ORD_STREET"/>
+    <result property="city" jdbcType="VARCHAR" column="ORD_CITY"/>
+    <result property="province" jdbcType="VARCHAR" column="ORD_PROVINCE"/>
+    <result property="postalCode" jdbcType="VARCHAR" column="ORD_POSTAL_CODE"/>
+    <result property="favouriteLineItem"
+            column="{orderId=ORD_ID,lineId=ORD_FAVOURITE_LINE}"
+            select="getDynSpecificLineItem"/>
+  </resultMap>
+
+  <resultMap id="order-joined-favourite" class="order">
+    <result property="id" column="ORD_ID"/>
+    <result property="date" column="ORD_DATE"/>
+    <result property="cardExpiry" column="ORD_CARD_EXPIRY"/>
+    <result property="cardType" column="ORD_CARD_TYPE"/>
+    <result property="cardNumber" column="ORD_CARD_NUMBER"/>
+    <result property="street" column="ORD_STREET"/>
+    <result property="city" column="ORD_CITY"/>
+    <result property="province" column="ORD_PROVINCE"/>
+    <result property="postalCode" column="ORD_POSTAL_CODE"/>
+    <result property="favouriteLineItem.id" column="LIN_ID"/>
+    <result property="favouriteLineItem.orderId" column="LIN_ORD_ID"/>
+    <result property="favouriteLineItem.itemCode" column="LIN_ITM_CODE"/>
+    <result property="favouriteLineItem.quantity" column="LIN_QUANTITY"/>
+    <result property="favouriteLineItem.price" column="LIN_PRICE"/>
+  </resultMap>
+
+  <select id="getOrderJoinedFavourite"
+          parameterClass="java.lang.Integer"
+          resultMap="order-joined-favourite">
+    select * from ORDERS, LINE_ITEM
+    where ORD_ID = LIN_ORD_ID
+    and ORD_FAVOURITE_LINE = LIN_ID
+    and ORD_ID = #value#
+  </select>
+
+  <select id="getOrderLiteByColumnName"
+          parameterClass="java.lang.Integer"
+          resultMap="lite-order-result-by-name">
+    select * from ORDERS where ORD_ID = #value#
+  </select>
+
+  <select id="getOrderWithFavouriteLineItem"
+          parameterClass="java.lang.Integer"
+          resultMap="order-with-favourite-line-item">
+    select * from ORDERS where ORD_ID = #value#
+  </select>
+
+  <select id="getOrderWithDynFavouriteLineItem"
+          parameterClass="java.lang.Integer"
+          resultMap="order-with-dyn-favourite-line-item">
+    select * from ORDERS where ORD_ID = #value#
+  </select>
+
+  <select id="getOrderAsMap"
+          parameterClass="java.lang.Integer"
+          resultMap="lite-order-map-result">
+    select * from ORDERS where ORD_ID = #value#
+  </select>
+
+  <select id="getOrderLiteByColumnIndex"
+          parameterClass="java.lang.Integer"
+          resultMap="lite-order-result-by-index">
+    select
+    ORD_ID,
+    ORD_DATE,
+    ORD_CARD_EXPIRY,
+    ORD_CARD_TYPE,
+    ORD_CARD_NUMBER,
+    ORD_STREET,
+    ORD_CITY,
+    ORD_PROVINCE,
+    ORD_POSTAL_CODE
+    from ORDERS where ORD_ID = #value#
+  </select>
+
+  <select id="getOrderWithAccount"
+          parameterClass="java.lang.Integer"
+          resultMap="order-with-account-result">
+    select * from ORDERS where ORD_ID = #value#
+  </select>
+
+  <select id="getOrderWithTypes"
+          parameterClass="java.lang.Integer"
+          resultMap="order-with-types-result" cacheModel="order-cache">
+    select * from ORDERS where ORD_ID = #value#
+  </select>
+
+  <select id="getOrderWithLineItems"
+          parameterClass="java.lang.Integer"
+          resultMap="order-with-lines-result">
+    select * from ORDERS where ORD_ID = #value#
+  </select>
+
+  <select id="getOrderWithLineItemArray"
+          parameterClass="java.lang.Integer"
+          resultMap="order-with-lines-array">
+    select * from ORDERS where ORD_ID = #value#
+  </select>
+
+  <select id="getOrderWithLineItemsCollection"
+          parameterClass="java.lang.Integer"
+          resultMap="order-with-collection-result">
+    select * from ORDERS where ORD_ID = #value#
+  </select>
+
+
+  <select id="getAllCreditCardNumbersFromOrders"
+          resultMap="credit-card-result">
+    select distinct ORD_CARD_NUMBER from ORDERS
+    order by ORD_CARD_NUMBER
+  </select>
+
+  <select id="getAllOrdersWithNestedResultMaps" resultMap="orderResultWithNestedMaps">
+    select o.*, a.*, l.*
+    from Orders o join Account a on o.ord_acc_id = a.acc_id
+    join Line_Item l on l.lin_ord_id = o.ord_id
+    order by o.ord_id
+  </select>
+
+</sqlMap>
\ No newline at end of file

Added: ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/PrivateBook.xml
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/PrivateBook.xml?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/PrivateBook.xml (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/PrivateBook.xml Thu Aug  7 16:21:46 2008
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!DOCTYPE sqlMap
+    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
+    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
+
+<sqlMap namespace="Book">
+
+  <select id="getPrivateBooks" resultClass="testdomain.PrivateBook">
+    select
+    DOCUMENT_ID as id,
+    DOCUMENT_TITLE as title,
+    DOCUMENT_TYPE as type,
+    DOCUMENT_PAGENUMBER as pages
+    from DOCUMENTS
+    where DOCUMENT_TYPE = 'BOOK'
+  </select>
+
+</sqlMap>
\ No newline at end of file

Added: ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/RepeatingGroupMapping.xml
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/RepeatingGroupMapping.xml?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/RepeatingGroupMapping.xml (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/RepeatingGroupMapping.xml Thu Aug  7 16:21:46 2008
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!DOCTYPE sqlMap
+    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
+    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
+
+<sqlMap>
+
+  <resultMap id="categoryResult" class="testdomain.Category" groupBy="categoryId">
+    <result property="categoryId" column="catid"/>
+    <result property="name" column="catname"/>
+    <result property="description" column="catdescn"/>
+    <result property="productList" resultMap="productResult"/>
+  </resultMap>
+
+  <resultMap id="categoryResultExtended" class="testdomain.Category" extends="categoryResult">
+    <result property="name" column="catname"/>
+  </resultMap>
+
+  <resultMap id="productResult" class="testdomain.Product" groupBy="productId">
+    <result property="productId" column="productid"/>
+    <result property="categoryId" column="category"/>
+    <result property="name" column="prodname"/>
+    <result property="description" column="proddescn"/>
+    <result property="itemList" resultMap="itemResult"/>
+  </resultMap>
+
+  <resultMap id="itemResult" class="testdomain.Item">
+    <result property="itemId" column="itemid"/>
+    <result property="productId" column="productid"/>
+    <result property="listPrice" column="listprice"/>
+    <result property="unitCost" column="unitcost"/>
+    <result property="supplierId" column="supplier"/>
+    <result property="status" column="status"/>
+    <result property="attribute1" column="attr1"/>
+    <result property="quantity" column="qty"/>
+  </resultMap>
+
+  <resultMap id="categoryResultJIRA250" class="testdomain.Category" groupBy="categoryId">
+    <result property="categoryId" column="catid"/>
+    <result property="name" column="catname"/>
+    <result property="description" column="catdescn"/>
+    <result property="productList" resultMap="productResultJIRA250"/>
+  </resultMap>
+
+  <resultMap id="productResultJIRA250" class="testdomain.Product" groupBy="productId">
+    <result property="productId" column="productid"/>
+    <result property="categoryId" column="category"/>
+    <result property="name" column="prodname"/>
+    <result property="description" column="proddescn"/>
+  </resultMap>
+
+  <select id="getAllCategories" resultMap="categoryResult">
+    select
+    c.catid, c.name as catname, c.descn as catdescn,
+    p.productid, p.category, p.name as prodname,
+    p.descn as proddescn, i.itemid, i.productid,
+    i.listprice, i.unitcost, i.supplier, i.status,
+    i.attr1, i.attr2, i.attr3, i.attr4, i.attr5,
+    v.itemid, v.qty
+    from category c, product p, item i, inventory v
+    where c.catid = p.category
+    and p.productid = i.productid
+    and i.itemid = v.itemid
+  </select>
+
+  <select id="getAllCategoriesExtended" resultMap="categoryResultExtended">
+    select
+    c.catid, c.name as catname, c.descn as catdescn,
+    p.productid, p.category, p.name as prodname,
+    p.descn as proddescn, i.itemid, i.productid,
+    i.listprice, i.unitcost, i.supplier, i.status,
+    i.attr1, i.attr2, i.attr3, i.attr4, i.attr5,
+    v.itemid, v.qty
+    from category c, product p, item i, inventory v
+    where c.catid = p.category
+    and p.productid = i.productid
+    and i.itemid = v.itemid
+  </select>
+
+  <select id="getFish" resultMap="categoryResult">
+    select
+    c.catid, c.name as catname, c.descn as catdescn,
+    p.productid, p.category, p.name as prodname,
+    p.descn as proddescn, i.itemid, i.productid,
+    i.listprice, i.unitcost, i.supplier, i.status,
+    i.attr1, i.attr2, i.attr3, i.attr4, i.attr5,
+    v.itemid, v.qty
+    from category c, product p, item i, inventory v
+    where c.catid = p.category
+    and p.productid = i.productid
+    and i.itemid = v.itemid
+    and c.catid = 'FISH'
+  </select>
+
+  <select id="getAllProductCategoriesJIRA250" resultMap="categoryResultJIRA250">
+    select
+    c.catid, c.name as catname, c.descn as catdescn,
+    null as productid, null as category, null as prodname,
+    null as proddescn
+    from category c
+  </select>
+
+</sqlMap>

Added: ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/ResultObjectFactoryStatements.xml
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/ResultObjectFactoryStatements.xml?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/ResultObjectFactoryStatements.xml (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/ResultObjectFactoryStatements.xml Thu Aug  7 16:21:46 2008
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
+<sqlMap namespace="ResultObjectFactoryStatements">
+
+  <resultMap id="itemResultROF" class="testdomain.IItem">
+    <result column="itemid" property="itemId"/>
+    <result column="productid" property="productId"/>
+    <result column="listprice" property="listPrice"/>
+    <result column="unitcost" property="unitCost"/>
+    <result column="status" property="status"/>
+    <result column="attr1" property="attribute1"/>
+    <result column="attr2" property="attribute2"/>
+    <result column="attr3" property="attribute3"/>
+    <result column="attr4" property="attribute4"/>
+    <result column="attr5" property="attribute5"/>
+    <result column="{supplierId=supplier}" property="supplier" select="getSupplierByIdROF"/>
+  </resultMap>
+
+  <resultMap id="supplierResultROF" class="testdomain.ISupplier">
+    <result column="suppid" property="supplierId"/>
+    <result column="name" property="name"/>
+    <result column="status" property="status"/>
+    <result column="addr1" property="addressLine1"/>
+    <result column="addr2" property="addressLine1"/>
+    <result column="city" property="city"/>
+    <result column="state" property="state"/>
+    <result column="zip" property="zip"/>
+    <result column="phone" property="phone"/>
+  </resultMap>
+
+  <select id="getAllItemsROF" resultMap="itemResultROF">
+    select *
+    from item
+  </select>
+
+  <select id="getSupplierByIdROF" resultMap="supplierResultROF" parameterClass="testdomain.ISupplierKey">
+    select *
+    from supplier
+    where suppid = #supplierId#
+  </select>
+</sqlMap>

Added: ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/SqlMapConfig.properties
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/SqlMapConfig.properties?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/SqlMapConfig.properties (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/SqlMapConfig.properties Thu Aug  7 16:21:46 2008
@@ -0,0 +1,7 @@
+driver=org.hsqldb.jdbcDriver
+url=jdbc:hsqldb:.
+username=sa
+password=
+
+SqlMapPath=com/ibatis/sqlmap/maps
+dataSourceType=SIMPLE

Added: ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/SqlMapConfig.xml
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/SqlMapConfig.xml?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/SqlMapConfig.xml (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/SqlMapConfig.xml Thu Aug  7 16:21:46 2008
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!DOCTYPE sqlMapConfig
+    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
+    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
+
+<sqlMapConfig>
+
+  <properties resource="com/ibatis/sqlmap/maps/SqlMapConfig.properties"/>
+
+  <!-- settings
+	add these to test bug 976614
+	enhancementEnabled="false"
+    lazyLoadingEnabled="false"
+  -->
+
+  <settings
+      cacheModelsEnabled="true"
+      enhancementEnabled="false"
+      lazyLoadingEnabled="true"
+      statementCachingEnabled="false"
+      useStatementNamespaces="false"
+      />
+
+  <typeAlias alias="order" type="testdomain.Order"/>
+  <typeAlias alias="OuiNonBool" type="com.ibatis.sqlmap.extensions.PirateTypeHandlerCallback"/>
+
+  <typeHandler javaType="boolean" jdbcType="VARCHAR" callback="OuiNonBool"/>
+
+  <transactionManager type="JDBC" commitRequired="false">
+    <dataSource type="${dataSourceType}">
+      <property name="JDBC.Driver" value="${driver}"/>
+      <property name="JDBC.ConnectionURL" value="${url}"/>
+      <property name="JDBC.Username" value="${username}"/>
+      <property name="JDBC.Password" value="${password}"/>
+      <property name="JDBC.DefaultAutoCommit" value="true"/>
+      <property name="Pool.MaximumActiveConnections" value="10"/>
+      <property name="Pool.MaximumIdleConnections" value="5"/>
+      <property name="Pool.MaximumCheckoutTime" value="120000"/>
+      <property name="Pool.TimeToWait" value="500"/>
+      <property name="Pool.PingQuery" value="select 1 from ACCOUNT"/>
+      <property name="Pool.PingEnabled" value="false"/>
+      <property name="Pool.PingConnectionsNotUsedFor" value="1"/>
+      <property name="Pool.QuietMode" value="true"/>
+    </dataSource>
+  </transactionManager>
+
+  <sqlMap resource="${SqlMapPath}/Account.xml"/>
+  <sqlMap resource="${SqlMapPath}/DynamicAccount.xml"/>
+  <sqlMap resource="${SqlMapPath}/Order.xml"/>
+  <sqlMap resource="${SqlMapPath}/LineItem.xml"/>
+  <sqlMap resource="${SqlMapPath}/OracleProc.xml"/>
+  <sqlMap resource="${SqlMapPath}/Complex.xml"/>
+  <sqlMap resource="${SqlMapPath}/XmlStatements.xml"/>
+  <sqlMap resource="${SqlMapPath}/DomStatements.xml"/>
+  <sqlMap resource="${SqlMapPath}/RepeatingGroupMapping.xml"/>
+  <sqlMap resource="${SqlMapPath}/Documents.xml"/>
+  <sqlMap resource="${SqlMapPath}/Jira.xml"/>
+  <sqlMap resource="${SqlMapPath}/NestedIterateStatements.xml"/>
+  <sqlMap resource="${SqlMapPath}/PrivateBook.xml"/>
+
+</sqlMapConfig>

Added: ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/SqlMapConfig_rof.xml
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/SqlMapConfig_rof.xml?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/SqlMapConfig_rof.xml (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/SqlMapConfig_rof.xml Thu Aug  7 16:21:46 2008
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!DOCTYPE sqlMapConfig
+    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
+    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
+
+<sqlMapConfig>
+
+  <properties resource="com/ibatis/sqlmap/maps/SqlMapConfig.properties"/>
+
+  <settings
+      cacheModelsEnabled="true"
+      enhancementEnabled="false"
+      lazyLoadingEnabled="true"
+      useStatementNamespaces="false"
+      />
+
+  <resultObjectFactory type="com.ibatis.sqlmap.ResultObjectFactoryImpl">
+    <property name="someProperty" value="someValue"/>
+  </resultObjectFactory>
+
+  <typeAlias alias="order" type="testdomain.Order"/>
+  <typeAlias alias="OuiNonBool" type="com.ibatis.sqlmap.extensions.PirateTypeHandlerCallback"/>
+
+  <typeHandler javaType="boolean" jdbcType="VARCHAR" callback="OuiNonBool"/>
+
+  <transactionManager type="JDBC" commitRequired="false">
+    <dataSource type="${dataSourceType}">
+      <property name="JDBC.Driver" value="${driver}"/>
+      <property name="JDBC.ConnectionURL" value="${url}"/>
+      <property name="JDBC.Username" value="${username}"/>
+      <property name="JDBC.Password" value="${password}"/>
+      <property name="JDBC.DefaultAutoCommit" value="true"/>
+      <property name="Pool.MaximumActiveConnections" value="10"/>
+      <property name="Pool.MaximumIdleConnections" value="5"/>
+      <property name="Pool.MaximumCheckoutTime" value="120000"/>
+      <property name="Pool.TimeToWait" value="500"/>
+      <property name="Pool.PingQuery" value="select 1 from ACCOUNT"/>
+      <property name="Pool.PingEnabled" value="false"/>
+      <property name="Pool.PingConnectionsNotUsedFor" value="1"/>
+      <property name="Pool.QuietMode" value="true"/>
+    </dataSource>
+  </transactionManager>
+
+  <sqlMap resource="${SqlMapPath}/ResultObjectFactoryStatements.xml"/>
+
+</sqlMapConfig>

Added: ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/XmlStatements.xml
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/XmlStatements.xml?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/XmlStatements.xml (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/maps/XmlStatements.xml Thu Aug  7 16:21:46 2008
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!DOCTYPE sqlMap
+    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
+    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
+
+<sqlMap>
+
+  <parameterMap id="xml-parameter-map" class="map">
+    <parameter property="id"/>
+  </parameterMap>
+
+  <resultMap id="xml-account-result" class="hashmap">
+    <result property="id" column="ACC_ID"/>
+    <result property="firstName" column="ACC_FIRST_NAME"/>
+    <result property="lastName" column="ACC_LAST_NAME"/>
+    <result property="emailAddress" column="ACC_EMAIL"/>
+    <result property="account" column="{id=ACC_ID}" select="getAccountXml"/>
+  </resultMap>
+
+  <resultMap id="xml-order-with-lines-result" class="hashmap" extends="lite-order-result-by-name">
+    <result property="lineItems" javaType="map" column="{value=ORD_ID}" select="getLineItemsForOrderXml"/>
+  </resultMap>
+
+  <select id="getAccountXmlExternalMaps"
+          parameterMap="xml-parameter-map"
+          resultMap="xml-account-result">
+    select
+    ACC_ID,
+    ACC_FIRST_NAME,
+    ACC_LAST_NAME,
+    ACC_EMAIL
+    from ACCOUNT
+    where ACC_ID = ?
+  </select>
+
+  <select id="getAccountXml"
+          parameterClass="map"
+          resultClass="hashmap">
+    select
+    ACC_ID as id,
+    ACC_FIRST_NAME as firstName,
+    ACC_LAST_NAME as lastName,
+    ACC_EMAIL as emailAddress
+    from ACCOUNT
+    where ACC_ID = #id#
+  </select>
+
+  <select id="getLineItemsForOrderXml"
+          parameterClass="map"
+          resultClass="hashmap">
+    select
+    LIN_ID as id,
+    LIN_ORD_ID as orderId,
+    LIN_ITM_CODE as itemCode,
+    LIN_QUANTITY as quantity,
+    LIN_PRICE as price
+    from LINE_ITEM where LIN_ORD_ID = #value#
+  </select>
+
+  <select id="getOrderXml"
+          parameterClass="map"
+          resultMap="xml-order-with-lines-result">
+    select * from ORDERS where ORD_ID = #id#
+  </select>
+
+
+</sqlMap>
\ No newline at end of file

Added: ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/proc/DerbyProcs.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/proc/DerbyProcs.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/proc/DerbyProcs.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-compat/src/test/java/com/ibatis/sqlmap/proc/DerbyProcs.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,19 @@
+package com.ibatis.sqlmap.proc;
+
+import java.sql.*;
+
+public class DerbyProcs {
+  public static void selectRows(int p1, int p2, int p3, int p4, ResultSet[] rs1, ResultSet[] rs2) throws SQLException {
+    Connection conn = DriverManager.getConnection("jdbc:default:connection");
+    PreparedStatement ps1 = conn.prepareStatement("select * from account where acc_id in (?,?)");
+    ps1.setInt(1, p1);
+    ps1.setInt(2, p2);
+    rs1[0] = ps1.executeQuery();
+    PreparedStatement ps2 = conn.prepareStatement("select * from account where acc_id in (?,?)");
+    ps2.setInt(1, p3);
+    ps2.setInt(2, p4);
+    rs2[0] = ps2.executeQuery();
+    conn.close();
+  }
+
+}
\ No newline at end of file