7
7
*
8
8
*
9
9
* IDENTIFICATION
10
- * $Header: /cvsroot/pgsql/src/backend/utils/sort/Attic/psort.c,v 1.23 1997/09/1805:37:31 vadim Exp $
10
+ * $Header: /cvsroot/pgsql/src/backend/utils/sort/Attic/psort.c,v 1.24 1997/09/1814:41:56 vadim Exp $
11
11
*
12
12
* NOTES
13
13
*Sorts the first relation into the second relation.
@@ -147,8 +147,6 @@ psort_begin(Sort * node, int nkeys, ScanKey key)
147
147
PS (node )-> treeContext .sortMem = SortMem * 1024 ;
148
148
149
149
PS (node )-> Tuples = NULL ;
150
- PS (node )-> lasttuple = NULL ;
151
- PS (node )-> lt_tupcount = 0 ;
152
150
PS (node )-> tupcount = 0 ;
153
151
154
152
PS (node )-> using_tape_files = false;
@@ -434,45 +432,14 @@ createfirstrun(Sort *node)
434
432
if (LACKMEM (node ) )/* in-memory sort is impossible */
435
433
{
436
434
registerint t ;
437
- registerint f ;
438
- FILE * file ;
439
435
440
436
Assert (!foundeor );
441
437
inittapes (node );
442
- file = PS (node )-> Tape -> tp_file ;
443
-
444
- /* put extra tuples into tape file */
445
- if (t_last > SortTuplesInTree )
446
- {
447
- registerHeapTuple lasttuple ;
448
-
449
- t = t_last - SortTuplesInTree ;
450
- for (f = 0 ,lasttuple = NULL ;f < t ;f ++ )
451
- {
452
- if (lasttuple )
453
- {
454
- FREEMEM (node ,lasttuple -> t_len );
455
- FREE (lasttuple );
456
- TRACEMEM (createfirstrun );
457
- }
458
- lasttuple = memtuples [f ];
459
- PUTTUP (node ,lasttuple ,file );
460
- TRACEOUT (createfirstrun ,lasttuple );
461
- }
462
- PS (node )-> lasttuple = lasttuple ;
463
- }
464
- else
465
- {
466
- PS (node )-> lasttuple = NULL ;
467
- f = 0 ;
468
- }
469
-
470
- /* put rest of tuples into leftist tree for createrun */
471
- for (t = t_last - 1 ;t >=f ;t -- )
438
+ /* put tuples into leftist tree for createrun */
439
+ for (t = t_last - 1 ;t >=0 ;t -- )
472
440
puttuple (& PS (node )-> Tuples ,memtuples [t ],0 ,& PS (node )-> treeContext );
473
- PS (node )-> lt_tupcount = t_last - f ;
474
441
pfree (memtuples );
475
- foundeor = !createrun (node ,file );
442
+ foundeor = !createrun (node ,PS ( node ) -> Tape -> tp_file );
476
443
}
477
444
else
478
445
{
@@ -497,50 +464,41 @@ createfirstrun(Sort *node)
497
464
static bool
498
465
createrun (Sort * node ,FILE * file )
499
466
{
500
- registerHeapTuple lasttuple ;
501
- registerHeapTuple tup ;
502
- struct leftist * nextrun ;
503
- bool foundeor ;
504
- short junk ;
505
- int curr_tupcount = (PS (node )-> Tuples != NULL ) ?PS (node )-> lt_tupcount :0 ;
506
- int next_tupcount = 0 ;
507
-
508
- int cr_tuples = 0 ;/* Count tuples grabbed from plannode */
509
- TupleTableSlot * cr_slot ;
467
+ registerHeapTuple lasttuple ;
468
+ registerHeapTuple tup ;
469
+ TupleTableSlot * cr_slot ;
470
+ HeapTuple * memtuples ;
471
+ int t_last = -1 ;
472
+ int t_free = 1000 ;
473
+ bool foundeor = false;
474
+ short junk ;
510
475
511
476
Assert (node != (Sort * )NULL );
512
477
Assert (PS (node )!= (Psortstate * )NULL );
478
+ Assert (PS (node )-> using_tape_files );
513
479
514
- lasttuple = PS ( node ) -> lasttuple ; /* ! NULL if called from createfirstrun */
515
- nextrun = NULL ;
516
- foundeor = false;
480
+ lasttuple = NULL ;
481
+ memtuples = palloc ( t_free * sizeof ( HeapTuple )) ;
482
+
517
483
for (;;)
518
484
{
519
- if (( LACKMEM (node )&& PS (node )-> Tuples != NULL ) || curr_tupcount > SortTuplesInTree )
485
+ while ( LACKMEM (node )&& PS (node )-> Tuples != NULL )
520
486
{
521
- do
487
+ if ( lasttuple != NULL )
522
488
{
523
- if (lasttuple != NULL )
524
- {
525
- FREEMEM (node ,lasttuple -> t_len );
526
- FREE (lasttuple );
527
- TRACEMEM (createrun );
528
- }
529
- lasttuple = tup = gettuple (& PS (node )-> Tuples ,& junk ,
489
+ FREEMEM (node ,lasttuple -> t_len );
490
+ FREE (lasttuple );
491
+ TRACEMEM (createrun );
492
+ }
493
+ lasttuple = gettuple (& PS (node )-> Tuples ,& junk ,
530
494
& PS (node )-> treeContext );
531
- Assert (PS (node )-> using_tape_files );
532
- PUTTUP (node ,tup ,file );
533
- TRACEOUT (createrun ,tup );
534
- curr_tupcount -- ;
535
- }while (LACKMEM (node )&& PS (node )-> Tuples != NULL );
495
+ PUTTUP (node ,lasttuple ,file );
496
+ TRACEOUT (createrun ,lasttuple );
536
497
}
537
498
538
499
if (LACKMEM (node ))
539
500
break ;
540
501
541
- if (next_tupcount >=SortTuplesInTree )
542
- break ;
543
-
544
502
/*
545
503
* About to call ExecProcNode, it can mess up the state if it
546
504
* eventually calls another Sort node. So must stow it away here
@@ -560,7 +518,6 @@ createrun(Sort * node, FILE * file)
560
518
tup = tuplecopy (cr_slot -> val );
561
519
ExecClearTuple (cr_slot );
562
520
PS (node )-> tupcount ++ ;
563
- cr_tuples ++ ;
564
521
}
565
522
566
523
IncrProcessed ();
@@ -569,14 +526,18 @@ createrun(Sort * node, FILE * file)
569
526
if (lasttuple != NULL && tuplecmp (tup ,lasttuple ,
570
527
& PS (node )-> treeContext ))
571
528
{
572
- puttuple (& nextrun ,tup ,0 ,& PS (node )-> treeContext );
573
- next_tupcount ++ ;
529
+ if (t_free <=0 )
530
+ {
531
+ t_free = 1000 ;
532
+ memtuples = repalloc (memtuples ,
533
+ (t_last + t_free + 1 )* sizeof (HeapTuple ));
534
+ }
535
+ t_last ++ ;
536
+ t_free -- ;
537
+ memtuples [t_last ]= tup ;
574
538
}
575
539
else
576
- {
577
540
puttuple (& PS (node )-> Tuples ,tup ,0 ,& PS (node )-> treeContext );
578
- curr_tupcount ++ ;
579
- }
580
541
}
581
542
if (lasttuple != NULL )
582
543
{
@@ -585,13 +546,26 @@ createrun(Sort * node, FILE * file)
585
546
TRACEMEM (createrun );
586
547
}
587
548
dumptuples (file ,node );
588
- ENDRUN (file );
589
- /* delimit the end of the run */
590
- PS (node )-> Tuples = nextrun ;
591
- PS (node )-> lt_tupcount = next_tupcount ;
592
- PS (node )-> lasttuple = NULL ;
549
+ ENDRUN (file );/* delimit the end of the run */
550
+
551
+ t_last ++ ;
552
+ /* put tuples for the next run into leftist tree */
553
+ if (t_last >=1 )
554
+ {
555
+ registerint t ;
556
+
557
+ PsortTupDesc = PS (node )-> treeContext .tupDesc ;
558
+ PsortKeys = PS (node )-> treeContext .scanKeys ;
559
+ PsortNkeys = PS (node )-> treeContext .nKeys ;
560
+ qsort (memtuples ,t_last ,sizeof (HeapTuple ),
561
+ (int (* )(const void * ,const void * ))_psort_cmp );
562
+ for (t = t_last - 1 ;t >=0 ;t -- )
563
+ puttuple (& PS (node )-> Tuples ,memtuples [t ],0 ,& PS (node )-> treeContext );
564
+ }
565
+
566
+ pfree (memtuples );
593
567
594
- return (( bool ) ! foundeor );/* XXX - works iff bool is {0,1} */
568
+ return (! foundeor );
595
569
}
596
570
597
571
/*
@@ -774,8 +748,7 @@ dumptuples(FILE * file, Sort * node)
774
748
newp = tp -> lt_left ;
775
749
else
776
750
newp = lmerge (tp -> lt_left ,tp -> lt_right ,context );
777
- FREEMEM (node ,sizeof (struct leftist ));
778
- FREE (tp );
751
+ pfree (tp );
779
752
PUTTUP (node ,tup ,file );
780
753
FREEMEM (node ,tup -> t_len );
781
754
FREE (tup );