| 1137 | } |
| 1138 | |
| 1139 | BoolExprNode* ComparativeBoolNode::createRseNode(DsqlCompilerScratch* dsqlScratch, UCHAR rseBlrOp) |
| 1140 | { |
| 1141 | MemoryPool& pool = dsqlScratch->getPool(); |
| 1142 | |
| 1143 | // Create a derived table representing our subquery. |
| 1144 | SelectExprNode* dt = FB_NEW_POOL(pool) SelectExprNode(pool); |
| 1145 | // Ignore validation for column names that must exist for "user" derived tables. |
| 1146 | dt->dsqlFlags = RecordSourceNode::DFLAG_DT_IGNORE_COLUMN_CHECK | RecordSourceNode::DFLAG_DERIVED; |
| 1147 | dt->querySpec = static_cast<RecordSourceNode*>(dsqlSpecialArg.getObject()); |
| 1148 | |
| 1149 | RseNode* querySpec = FB_NEW_POOL(pool) RseNode(pool); |
| 1150 | querySpec->dsqlFrom = FB_NEW_POOL(pool) RecSourceListNode(pool, 1); |
| 1151 | querySpec->dsqlFrom->items[0] = dt; |
| 1152 | |
| 1153 | SelectExprNode* select_expr = FB_NEW_POOL(pool) SelectExprNode(pool); |
| 1154 | select_expr->querySpec = querySpec; |
| 1155 | |
| 1156 | const DsqlContextStack::iterator base(*dsqlScratch->context); |
| 1157 | const DsqlContextStack::iterator baseDT(dsqlScratch->derivedContext); |
| 1158 | const DsqlContextStack::iterator baseUnion(dsqlScratch->unionContext); |
| 1159 | |
| 1160 | RseNode* rse = PASS1_rse(dsqlScratch, select_expr); |
| 1161 | rse->flags |= RseNode::FLAG_DSQL_COMPARATIVE; |
| 1162 | |
| 1163 | // Create a conjunct to be injected. |
| 1164 | |
| 1165 | ComparativeBoolNode* cmpNode = FB_NEW_POOL(pool) ComparativeBoolNode(pool, blrOp, |
| 1166 | doDsqlPass(dsqlScratch, arg1, false), rse->dsqlSelectList->items[0]); |
| 1167 | |
| 1168 | PASS1_set_parameter_type(dsqlScratch, cmpNode->arg1, cmpNode->arg2, false); |
| 1169 | |
| 1170 | rse->dsqlWhere = cmpNode; |
| 1171 | |
| 1172 | // Create output node. |
| 1173 | RseBoolNode* rseBoolNode = FB_NEW_POOL(pool) RseBoolNode(pool, rseBlrOp, rse); |
| 1174 | rseBoolNode->line = line; |
| 1175 | rseBoolNode->column = column; |
| 1176 | |
| 1177 | // Finish off by cleaning up contexts |
| 1178 | dsqlScratch->unionContext.clear(baseUnion); |
| 1179 | dsqlScratch->derivedContext.clear(baseDT); |
| 1180 | dsqlScratch->context->clear(base); |
| 1181 | |
| 1182 | return rseBoolNode; |
| 1183 | } |
| 1184 | |
| 1185 | |
| 1186 | //-------------------- |
nothing calls this directly
no test coverage detected