MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / PASS1_sort

Function PASS1_sort

src/dsql/pass1.cpp:2320–2424  ·  view source on GitHub ↗

Process ORDER BY list, which may contain an ordinal or alias which references the select list.

Source from the content-addressed store, hash-verified

2318
2319// Process ORDER BY list, which may contain an ordinal or alias which references the select list.
2320ValueListNode* 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)))

Callers 3

pass1_rse_implFunction · 0.85
dsqlPassMethod · 0.85
internalDsqlPassMethod · 0.85

Calls 15

JRD_get_thread_dataFunction · 0.85
ERRD_postFunction · 0.85
GdsClass · 0.85
NumClass · 0.85
PASS1_lookup_aliasFunction · 0.85
StrClass · 0.85
OrderNodeClass · 0.85
getSlongMethod · 0.80
ValueListNodeClass · 0.70
getDefaultPoolMethod · 0.45
getCountMethod · 0.45
beginMethod · 0.45

Tested by

no test coverage detected