Hi Flavio,

I think that the AST you prefer would be equivalent to what the parser actually does. Both representations give the compiler the information which it needs for the tricky, later phases of rewriting the AST--the compiler considers many re-writes when it tries to optimize the execution of the subquery. Note that an IN list is much simpler than a subquery and the compiler has fewer options for re-arranging an IN list than a subquery.

I'm going on vacation now. Please don't be put off by my radio silence for the next week.

Cheers,
-Rick

flavio palumbo wrote:
Hi Rick (i hope you will answer to me),
i found a strange behavior in XmlTreeWalker using the "in" keyword connected to a select ; look at the following sql string : "update eurofile.tdepro set dpcdpr = ?, dpcdst = 'T', dpcdme = ? where dpcoti = ? and dpprsk = 0 and dpflag in(select aatipo from eurofile.tabtipo where aatipo = ?)" i thought that the "dpflag" field should not be inside a subquery while running XmlTreeWalker it is. Am i wrong ? I tried with a "in" connected to constant fields and the result is as i expected.
Can you give me a hint ?
Thanks a lot.
Flavio
ps below are both examples.

----------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<queryTree>
<queryText>update eurofile.tdepro set dpcdpr = ?, dpcdst = 'T', dpcdme = ? where dpcoti = ? and dpprsk = 0 and dpflag in(select aatipo from eurofile.tabtipo where aatipo = ?)</queryText>
    <node type="org.apache.derby.impl.sql.compile.UpdateNode">
        <contents>
            <member value="EUROFILE.TDEPRO"/>
            <member name="statementType" value="UPDATE"/>
        </contents>
        <node type="org.apache.derby.impl.sql.compile.SelectNode">
            <contents>
                <member name="isDistinct" value="false"/>
                <member name="resultSetNumber" value="0"/>
                <member name="referencedTableMap" value="null"/>
                <member name="statementResultSet" value="false"/>
            </contents>
            <node type="org.apache.derby.impl.sql.compile.ResultColumnList">
                <contents>
                    <member name="indexRow" value="false"/>
                </contents>
                <node type="org.apache.derby.impl.sql.compile.ResultColumn">
                    <contents>
                        <member name="exposedName" value="DPCDPR"/>
                        <member name="name" value="DPCDPR"/>
                        <member name="tableName" value="null"/>
                        <member name="isDefaultColumn" value="false"/>
                        <member name="wasDefaultColumn" value="false"/>
                        <member name="isNameGenerated" value="false"/>
                        <member name="sourceTableName" value="null"/>
                        <member name="type" value="null"/>
                        <member name="columnDescriptor" value="null"/>
                        <member name="isGenerated" value="false"/>
<member name="isGeneratedForUnmatchedColumnInInsert" value="false"/>
                        <member name="isGroupingColumn" value="false"/>
                        <member name="isReferenced" value="false"/>
                        <member name="isRedundant" value="false"/>
                        <member name="virtualColumnId" value="1"/>
                        <member name="resultSetNumber" value="-1"/>
                        <member name="dataTypeServices" value="null"/>
                    </contents>
<node type="org.apache.derby.impl.sql.compile.ParameterNode">
                        <contents>
                            <member name="dataTypeServices" value="null"/>
                        </contents>
                    </node>
                </node>
                <node type="org.apache.derby.impl.sql.compile.ResultColumn">
                    <contents>
                        <member name="exposedName" value="DPCDST"/>
                        <member name="name" value="DPCDST"/>
                        <member name="tableName" value="null"/>
                        <member name="isDefaultColumn" value="false"/>
                        <member name="wasDefaultColumn" value="false"/>
                        <member name="isNameGenerated" value="false"/>
                        <member name="sourceTableName" value="null"/>
                        <member name="type" value="CHAR(1) NOT NULL"/>
                        <member name="columnDescriptor" value="null"/>
                        <member name="isGenerated" value="false"/>
<member name="isGeneratedForUnmatchedColumnInInsert" value="false"/>
                        <member name="isGroupingColumn" value="false"/>
                        <member name="isReferenced" value="false"/>
                        <member name="isRedundant" value="false"/>
                        <member name="virtualColumnId" value="2"/>
                        <member name="resultSetNumber" value="-1"/>
                        <member name="dataTypeServices" value="null"/>
                    </contents>
<node type="org.apache.derby.impl.sql.compile.CharConstantNode">
                        <contents>
                            <member name="value" value="T"/>
<member name="dataTypeServices" value="CHAR(1) NOT NULL"/>
                        </contents>
                    </node>
                </node>
                <node type="org.apache.derby.impl.sql.compile.ResultColumn">
                    <contents>
                        <member name="exposedName" value="DPCDME"/>
                        <member name="name" value="DPCDME"/>
                        <member name="tableName" value="null"/>
                        <member name="isDefaultColumn" value="false"/>
                        <member name="wasDefaultColumn" value="false"/>
                        <member name="isNameGenerated" value="false"/>
                        <member name="sourceTableName" value="null"/>
                        <member name="type" value="null"/>
                        <member name="columnDescriptor" value="null"/>
                        <member name="isGenerated" value="false"/>
<member name="isGeneratedForUnmatchedColumnInInsert" value="false"/>
                        <member name="isGroupingColumn" value="false"/>
                        <member name="isReferenced" value="false"/>
                        <member name="isRedundant" value="false"/>
                        <member name="virtualColumnId" value="3"/>
                        <member name="resultSetNumber" value="-1"/>
                        <member name="dataTypeServices" value="null"/>
                    </contents>
<node type="org.apache.derby.impl.sql.compile.ParameterNode">
                        <contents>
                            <member name="dataTypeServices" value="null"/>
                        </contents>
                    </node>
                </node>
            </node>
            <node type="org.apache.derby.impl.sql.compile.FromList">
                <contents>
                </contents>
<node type="org.apache.derby.impl.sql.compile.FromBaseTable">
                    <contents>
                        <member name="tableName" value="EUROFILE.TDEPRO"/>
                        <member name="tableDescriptor" value="null"/>
                        <member name="updateOrDelete" value="1"/>
                        <member value="null"/>
                        <member name="existsBaseTable" value="false"/>
                        <member name="dependencyMap" value="null"/>
                        <member name="correlation Name" value="null"/>
                        <member value="null"/>
                        <member value="tableNumber -1"/>
                        <member value="level 0"/>
                        <member name="resultSetNumber" value="0"/>
                        <member name="referencedTableMap" value="null"/>
                        <member name="statementResultSet" value="false"/>
                    </contents>
                </node>
            </node>
            <node type="org.apache.derby.impl.sql.compile.AndNode">
                <contents>
                    <member name="operator" value="and"/>
                    <member name="methodName" value="and"/>
                    <member name="dataTypeServices" value="null"/>
                </contents>
                <node type="org.apache.derby.impl.sql.compile.AndNode">
                    <contents>
                        <member name="operator" value="and"/>
                        <member name="methodName" value="and"/>
                        <member name="dataTypeServices" value="null"/>
                    </contents>
<node type="org.apache.derby.impl.sql.compile.BinaryRelationalOperatorNode">
                        <contents>
                            <member name="operator" value="="/>
                            <member name="methodName" value="equals"/>
                            <member name="dataTypeServices" value="null"/>
                        </contents>
<node type="org.apache.derby.impl.sql.compile.ColumnReference">
                            <contents>
                                <member name="columnName" value="DPCOTI"/>
                                <member name="tableNumber" value="-1"/>
                                <member name="columnNumber" value="0"/>
<member name="replacesAggregate" value="false"/> <member name="replacesWindowFunctionCall" value="false"/>
                                <member name="tableName" value="null"/>
                                <member name="nestingLevel" value="-1"/>
                                <member name="sourceLevel" value="-1"/>
<member name="dataTypeServices" value="null"/>
                            </contents>
                        </node>
<node type="org.apache.derby.impl.sql.compile.ParameterNode">
                            <contents>
<member name="dataTypeServices" value="null"/>
                            </contents>
                        </node>
                    </node>
<node type="org.apache.derby.impl.sql.compile.BinaryRelationalOperatorNode">
                        <contents>
                            <member name="operator" value="="/>
                            <member name="methodName" value="equals"/>
                            <member name="dataTypeServices" value="null"/>
                        </contents>
<node type="org.apache.derby.impl.sql.compile.ColumnReference">
                            <contents>
                                <member name="columnName" value="DPPRSK"/>
                                <member name="tableNumber" value="-1"/>
                                <member name="columnNumber" value="0"/>
<member name="replacesAggregate" value="false"/> <member name="replacesWindowFunctionCall" value="false"/>
                                <member name="tableName" value="null"/>
                                <member name="nestingLevel" value="-1"/>
                                <member name="sourceLevel" value="-1"/>
<member name="dataTypeServices" value="null"/>
                            </contents>
                        </node>
<node type="org.apache.derby.impl.sql.compile.NumericConstantNode">
                            <contents>
                                <member name="value" value="0"/>
<member name="dataTypeServices" value="INTEGER NOT NULL"/>
                            </contents>
                        </node>
                    </node>
                </node>
                <node type="org.apache.derby.impl.sql.compile.SubqueryNode">
                    <contents>
                        <member name="subqueryType" value="1"/>
                        <member name="underTopAndNode" value="false"/>
                        <member name="subqueryNumber" value="-1"/>
                        <member name="pointOfAttachment" value="-1"/>
                        <member name="preprocessed" value="false"/>
                        <member name="distinctExpression" value="false"/>
                        <member name="dataTypeServices" value="null"/>
                    </contents>
<node type="org.apache.derby.impl.sql.compile.SelectNode">
                        <contents>
                            <member name="isDistinct" value="false"/>
                            <member name="resultSetNumber" value="0"/>
                            <member name="referencedTableMap" value="null"/>
<member name="statementResultSet" value="false"/>
                        </contents>
<node type="org.apache.derby.impl.sql.compile.ResultColumnList">
                            <contents>
                                <member name="indexRow" value="false"/>
                            </contents>
<node type="org.apache.derby.impl.sql.compile.ResultColumn">
                                <contents>
<member name="exposedName" value="AATIPO"/>
                                    <member name="name" value="AATIPO"/>
                                    <member name="tableName" value="null"/>
<member name="isDefaultColumn" value="false"/> <member name="wasDefaultColumn" value="false"/> <member name="isNameGenerated" value="false"/> <member name="sourceTableName" value="null"/>
                                    <member name="type" value="null"/>
<member name="columnDescriptor" value="null"/> <member name="isGenerated" value="false"/> <member name="isGeneratedForUnmatchedColumnInInsert" value="false"/> <member name="isGroupingColumn" value="false"/> <member name="isReferenced" value="false"/> <member name="isRedundant" value="false"/> <member name="virtualColumnId" value="1"/> <member name="resultSetNumber" value="-1"/> <member name="dataTypeServices" value="null"/>
                                </contents>
<node type="org.apache.derby.impl.sql.compile.ColumnReference">
                                    <contents>
<member name="columnName" value="AATIPO"/> <member name="tableNumber" value="-1"/> <member name="columnNumber" value="0"/> <member name="replacesAggregate" value="false"/> <member name="replacesWindowFunctionCall" value="false"/> <member name="tableName" value="null"/> <member name="nestingLevel" value="-1"/> <member name="sourceLevel" value="-1"/> <member name="dataTypeServices" value="null"/>
                                    </contents>
                                </node>
                            </node>
                        </node>
<node type="org.apache.derby.impl.sql.compile.FromList">
                            <contents>
                            </contents>
<node type="org.apache.derby.impl.sql.compile.FromBaseTable">
                                <contents>
<member name="tableName" value="EUROFILE.TABTIPO"/> <member name="tableDescriptor" value="null"/> <member name="updateOrDelete" value="0"/>
                                    <member value="null"/>
<member name="existsBaseTable" value="false"/> <member name="dependencyMap" value="null"/> <member name="correlation Name" value="null"/>
                                    <member value="null"/>
                                    <member value="tableNumber -1"/>
                                    <member value="level 0"/>
<member name="resultSetNumber" value="0"/> <member name="referencedTableMap" value="null"/> <member name="statementResultSet" value="false"/>
                                </contents>
                            </node>
                        </node>
<node type="org.apache.derby.impl.sql.compile.BinaryRelationalOperatorNode">
                            <contents>
                                <member name="operator" value="="/>
                                <member name="methodName" value="equals"/>
<member name="dataTypeServices" value="null"/>
                            </contents>
<node type="org.apache.derby.impl.sql.compile.ColumnReference">
                                <contents>
<member name="columnName" value="AATIPO"/>
                                    <member name="tableNumber" value="-1"/>
                                    <member name="columnNumber" value="0"/>
<member name="replacesAggregate" value="false"/> <member name="replacesWindowFunctionCall" value="false"/>
                                    <member name="tableName" value="null"/>
                                    <member name="nestingLevel" value="-1"/>
                                    <member name="sourceLevel" value="-1"/>
<member name="dataTypeServices" value="null"/>
                                </contents>
                            </node>
<node type="org.apache.derby.impl.sql.compile.ParameterNode">
                                <contents>
<member name="dataTypeServices" value="null"/>
                                </contents>
                            </node>
                        </node>
                    </node>
<node type="org.apache.derby.impl.sql.compile.ColumnReference">
                        <contents>
                            <member name="columnName" value="DPFLAG"/>
                            <member name="tableNumber" value="-1"/>
                            <member name="columnNumber" value="0"/>
                            <member name="replacesAggregate" value="false"/>
<member name="replacesWindowFunctionCall" value="false"/>
                            <member name="tableName" value="null"/>
                            <member name="nestingLevel" value="-1"/>
                            <member name="sourceLevel" value="-1"/>
                            <member name="dataTypeServices" value="null"/>
                        </contents>
                    </node>
                </node>
            </node>
        </node>
        <node type="org.apache.derby.impl.sql.compile.TableName">
            <contents>
                <member value="EUROFILE.TDEPRO"/>
            </contents>
        </node>
    </node>
</queryTree>
---------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<queryTree>
<queryText>update eurofile.tdepro set dpcdpr = ?, dpcdst = 'T', dpcdme = ? where dpcoti = ? and dpprsk = 0 and dpflag in('a', 'b', 'f', 'h')</queryText>
    <node type="org.apache.derby.impl.sql.compile.UpdateNode">
        <contents>
            <member value="EUROFILE.TDEPRO"/>
            <member name="statementType" value="UPDATE"/>
        </contents>
        <node type="org.apache.derby.impl.sql.compile.SelectNode">
            <contents>
                <member name="isDistinct" value="false"/>
                <member name="resultSetNumber" value="0"/>
                <member name="referencedTableMap" value="null"/>
                <member name="statementResultSet" value="false"/>
            </contents>
            <node type="org.apache.derby.impl.sql.compile.ResultColumnList">
                <contents>
                    <member name="indexRow" value="false"/>
                </contents>
                <node type="org.apache.derby.impl.sql.compile.ResultColumn">
                    <contents>
                        <member name="exposedName" value="DPCDPR"/>
                        <member name="name" value="DPCDPR"/>
                        <member name="tableName" value="null"/>
                        <member name="isDefaultColumn" value="false"/>
                        <member name="wasDefaultColumn" value="false"/>
                        <member name="isNameGenerated" value="false"/>
                        <member name="sourceTableName" value="null"/>
                        <member name="type" value="null"/>
                        <member name="columnDescriptor" value="null"/>
                        <member name="isGenerated" value="false"/>
<member name="isGeneratedForUnmatchedColumnInInsert" value="false"/>
                        <member name="isGroupingColumn" value="false"/>
                        <member name="isReferenced" value="false"/>
                        <member name="isRedundant" value="false"/>
                        <member name="virtualColumnId" value="1"/>
                        <member name="resultSetNumber" value="-1"/>
                        <member name="dataTypeServices" value="null"/>
                    </contents>
<node type="org.apache.derby.impl.sql.compile.ParameterNode">
                        <contents>
                            <member name="dataTypeServices" value="null"/>
                        </contents>
                    </node>
                </node>
                <node type="org.apache.derby.impl.sql.compile.ResultColumn">
                    <contents>
                        <member name="exposedName" value="DPCDST"/>
                        <member name="name" value="DPCDST"/>
                        <member name="tableName" value="null"/>
                        <member name="isDefaultColumn" value="false"/>
                        <member name="wasDefaultColumn" value="false"/>
                        <member name="isNameGenerated" value="false"/>
                        <member name="sourceTableName" value="null"/>
                        <member name="type" value="CHAR(1) NOT NULL"/>
                        <member name="columnDescriptor" value="null"/>
                        <member name="isGenerated" value="false"/>
<member name="isGeneratedForUnmatchedColumnInInsert" value="false"/>
                        <member name="isGroupingColumn" value="false"/>
                        <member name="isReferenced" value="false"/>
                        <member name="isRedundant" value="false"/>
                        <member name="virtualColumnId" value="2"/>
                        <member name="resultSetNumber" value="-1"/>
                        <member name="dataTypeServices" value="null"/>
                    </contents>
<node type="org.apache.derby.impl.sql.compile.CharConstantNode">
                        <contents>
                            <member name="value" value="T"/>
<member name="dataTypeServices" value="CHAR(1) NOT NULL"/>
                        </contents>
                    </node>
                </node>
                <node type="org.apache.derby.impl.sql.compile.ResultColumn">
                    <contents>
                        <member name="exposedName" value="DPCDME"/>
                        <member name="name" value="DPCDME"/>
                        <member name="tableName" value="null"/>
                        <member name="isDefaultColumn" value="false"/>
                        <member name="wasDefaultColumn" value="false"/>
                        <member name="isNameGenerated" value="false"/>
                        <member name="sourceTableName" value="null"/>
                        <member name="type" value="null"/>
                        <member name="columnDescriptor" value="null"/>
                        <member name="isGenerated" value="false"/>
<member name="isGeneratedForUnmatchedColumnInInsert" value="false"/>
                        <member name="isGroupingColumn" value="false"/>
                        <member name="isReferenced" value="false"/>
                        <member name="isRedundant" value="false"/>
                        <member name="virtualColumnId" value="3"/>
                        <member name="resultSetNumber" value="-1"/>
                        <member name="dataTypeServices" value="null"/>
                    </contents>
<node type="org.apache.derby.impl.sql.compile.ParameterNode">
                        <contents>
                            <member name="dataTypeServices" value="null"/>
                        </contents>
                    </node>
                </node>
            </node>
            <node type="org.apache.derby.impl.sql.compile.FromList">
                <contents>
                </contents>
<node type="org.apache.derby.impl.sql.compile.FromBaseTable">
                    <contents>
                        <member name="tableName" value="EUROFILE.TDEPRO"/>
                        <member name="tableDescriptor" value="null"/>
                        <member name="updateOrDelete" value="1"/>
                        <member value="null"/>
                        <member name="existsBaseTable" value="false"/>
                        <member name="dependencyMap" value="null"/>
                        <member name="correlation Name" value="null"/>
                        <member value="null"/>
                        <member value="tableNumber -1"/>
                        <member value="level 0"/>
                        <member name="resultSetNumber" value="0"/>
                        <member name="referencedTableMap" value="null"/>
                        <member name="statementResultSet" value="false"/>
                    </contents>
                </node>
            </node>
            <node type="org.apache.derby.impl.sql.compile.AndNode">
                <contents>
                    <member name="operator" value="and"/>
                    <member name="methodName" value="and"/>
                    <member name="dataTypeServices" value="null"/>
                </contents>
                <node type="org.apache.derby.impl.sql.compile.AndNode">
                    <contents>
                        <member name="operator" value="and"/>
                        <member name="methodName" value="and"/>
                        <member name="dataTypeServices" value="null"/>
                    </contents>
<node type="org.apache.derby.impl.sql.compile.BinaryRelationalOperatorNode">
                        <contents>
                            <member name="operator" value="="/>
                            <member name="methodName" value="equals"/>
                            <member name="dataTypeServices" value="null"/>
                        </contents>
<node type="org.apache.derby.impl.sql.compile.ColumnReference">
                            <contents>
                                <member name="columnName" value="DPCOTI"/>
                                <member name="tableNumber" value="-1"/>
                                <member name="columnNumber" value="0"/>
<member name="replacesAggregate" value="false"/> <member name="replacesWindowFunctionCall" value="false"/>
                                <member name="tableName" value="null"/>
                                <member name="nestingLevel" value="-1"/>
                                <member name="sourceLevel" value="-1"/>
<member name="dataTypeServices" value="null"/>
                            </contents>
                        </node>
<node type="org.apache.derby.impl.sql.compile.ParameterNode">
                            <contents>
<member name="dataTypeServices" value="null"/>
                            </contents>
                        </node>
                    </node>
<node type="org.apache.derby.impl.sql.compile.BinaryRelationalOperatorNode">
                        <contents>
                            <member name="operator" value="="/>
                            <member name="methodName" value="equals"/>
                            <member name="dataTypeServices" value="null"/>
                        </contents>
<node type="org.apache.derby.impl.sql.compile.ColumnReference">
                            <contents>
                                <member name="columnName" value="DPPRSK"/>
                                <member name="tableNumber" value="-1"/>
                                <member name="columnNumber" value="0"/>
<member name="replacesAggregate" value="false"/> <member name="replacesWindowFunctionCall" value="false"/>
                                <member name="tableName" value="null"/>
                                <member name="nestingLevel" value="-1"/>
                                <member name="sourceLevel" value="-1"/>
<member name="dataTypeServices" value="null"/>
                            </contents>
                        </node>
<node type="org.apache.derby.impl.sql.compile.NumericConstantNode">
                            <contents>
                                <member name="value" value="0"/>
<member name="dataTypeServices" value="INTEGER NOT NULL"/>
                            </contents>
                        </node>
                    </node>
                </node>
<node type="org.apache.derby.impl.sql.compile.InListOperatorNode">
                    <contents>
                        <member name="isOrdered" value="false"/>
                        <member name="operator" value="IN"/>
                        <member name="methodName" value="in"/>
                        <member name="dataTypeServices" value="null"/>
                    </contents>
<node type="org.apache.derby.impl.sql.compile.ColumnReference">
                        <contents>
                            <member name="columnName" value="DPFLAG"/>
                            <member name="tableNumber" value="-1"/>
                            <member name="columnNumber" value="0"/>
                            <member name="replacesAggregate" value="false"/>
<member name="replacesWindowFunctionCall" value="false"/>
                            <member name="tableName" value="null"/>
                            <member name="nestingLevel" value="-1"/>
                            <member name="sourceLevel" value="-1"/>
                            <member name="dataTypeServices" value="null"/>
                        </contents>
                    </node>
<node type="org.apache.derby.impl.sql.compile.ValueNodeList">
                        <contents>
                        </contents>
<node type="org.apache.derby.impl.sql.compile.CharConstantNode">
                            <contents>
                                <member name="value" value="a"/>
<member name="dataTypeServices" value="CHAR(1) NOT NULL"/>
                            </contents>
                        </node>
<node type="org.apache.derby.impl.sql.compile.CharConstantNode">
                            <contents>
                                <member name="value" value="b"/>
<member name="dataTypeServices" value="CHAR(1) NOT NULL"/>
                            </contents>
                        </node>
<node type="org.apache.derby.impl.sql.compile.CharConstantNode">
                            <contents>
                                <member name="value" value="f"/>
<member name="dataTypeServices" value="CHAR(1) NOT NULL"/>
                            </contents>
                        </node>
<node type="org.apache.derby.impl.sql.compile.CharConstantNode">
                            <contents>
                                <member name="value" value="h"/>
<member name="dataTypeServices" value="CHAR(1) NOT NULL"/>
                            </contents>
                        </node>
                    </node>
                </node>
            </node>
        </node>
        <node type="org.apache.derby.impl.sql.compile.TableName">
            <contents>
                <member value="EUROFILE.TDEPRO"/>
            </contents>
        </node>
    </node>
</queryTree>


-----------------------------------------------------------
Il presente messaggio non costituisce un impegno contrattuale tra SILMA S.r.l. 
ed il destinatario.
Le opinioni ivi espresse sono quelle dell'autore.
SILMA S.r.l. non assume alcuna responsabilita riguardo al contenuto del 
presente messaggio.
Il messaggio รจ destinato esclusivamente al destinatario.
Il contenuto e gli allegati sono da considerarsi di natura confidenziale

Nel caso abbiate ricevuto il presente messaggio per errore siete pregati di 
comunicarlo
alla casella [email protected].


Reply via email to