Process ORDER BY list, which may contain an ordinal or alias which references the select list.
| 2318 | |
| 2319 | // Process ORDER BY list, which may contain an ordinal or alias which references the select list. |
| 2320 | ValueListNode* PASS1_sort(DsqlCompilerScratch* dsqlScratch, ValueListNode* input, ValueListNode* selectList) |
| 2321 | { |
| 2322 | DEV_BLKCHK(dsqlScratch, dsql_type_req); |
| 2323 | DEV_BLKCHK(input, dsql_type_nod); |
| 2324 | DEV_BLKCHK(selectList, dsql_type_nod); |
| 2325 | |
| 2326 | thread_db* tdbb = JRD_get_thread_data(); |
| 2327 | MemoryPool& pool = *tdbb->getDefaultPool(); |
| 2328 | |
| 2329 | if (!input) |
| 2330 | { |
| 2331 | ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << |
| 2332 | Arg::Gds(isc_dsql_command_err) << |
| 2333 | // invalid ORDER BY clause |
| 2334 | Arg::Gds(isc_order_by_err)); |
| 2335 | } |
| 2336 | |
| 2337 | if (input->items.getCount() > MAX_SORT_ITEMS) |
| 2338 | { |
| 2339 | ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << |
| 2340 | Arg::Gds(isc_dsql_command_err) << |
| 2341 | Arg::Gds(isc_order_by_err) << |
| 2342 | // invalid ORDER BY clause, cannot sort on more than 255 items |
| 2343 | Arg::Gds(isc_dsql_max_sort_items)); |
| 2344 | } |
| 2345 | |
| 2346 | // Node is simply to be rebuilt -- just recurse merrily |
| 2347 | |
| 2348 | NestConst<ValueListNode> node = FB_NEW_POOL(pool) ValueListNode(pool, input->items.getCount()); |
| 2349 | NestConst<ValueExprNode>* ptr2 = node->items.begin(); |
| 2350 | |
| 2351 | for (FB_SIZE_T sortloop = 0; sortloop < input->items.getCount(); ++sortloop) |
| 2352 | { |
| 2353 | DEV_BLKCHK(input->items[sortloop], dsql_type_nod); |
| 2354 | NestConst<OrderNode> node1 = nodeAs<OrderNode>(input->items[sortloop]); |
| 2355 | if (!node1) |
| 2356 | { |
| 2357 | ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << |
| 2358 | Arg::Gds(isc_dsql_command_err) << |
| 2359 | // invalid ORDER BY clause |
| 2360 | Arg::Gds(isc_order_by_err)); |
| 2361 | } |
| 2362 | |
| 2363 | // get node of value to be ordered by |
| 2364 | NestConst<ValueExprNode> orderValue = node1->value; |
| 2365 | |
| 2366 | NestConst<CollateNode> collateNode = nodeAs<CollateNode>(orderValue); |
| 2367 | |
| 2368 | if (collateNode) |
| 2369 | { |
| 2370 | // substitute CollateNode with its argument (real value) |
| 2371 | orderValue = collateNode->arg; |
| 2372 | } |
| 2373 | |
| 2374 | FieldNode* field; |
| 2375 | LiteralNode* literal; |
| 2376 | |
| 2377 | if ((field = nodeAs<FieldNode>(orderValue))) |
no test coverage detected