88 *
99 *
1010 * IDENTIFICATION
11- * $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.49 2001/10/25 05:49:31 momjian Exp $
11+ * $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.50 2001/12/19 22:35:35 tgl Exp $
1212 *
1313 * HISTORY
1414 * AUTHORDATEMAJOR EVENT
@@ -41,6 +41,7 @@ print(void *obj)
4141s = nodeToString (obj );
4242printf ("%s\n" ,s );
4343fflush (stdout );
44+ pfree (s );
4445}
4546
4647/*
@@ -49,59 +50,77 @@ print(void *obj)
4950void
5051pprint (void * obj )
5152{
53+ #define INDENTSTOP 3
54+ #define MAXINDENT 60
55+ #define LINELEN 80
5256char * s ;
5357int i ;
54- char line [80 ];
58+ char line [LINELEN ];
5559int indentLev ;
60+ int indentDist ;
5661int j ;
5762
5863s = nodeToString (obj );
5964
60- indentLev = 0 ;
65+ indentLev = 0 ;/* logical indent level */
66+ indentDist = 0 ;/* physical indent distance */
6167i = 0 ;
6268for (;;)
6369{
64- for (j = 0 ;j < indentLev * 3 ;j ++ )
70+ for (j = 0 ;j < indentDist ;j ++ )
6571line [j ]= ' ' ;
66- for (;j < 75 && s [i ]!= '\0' ;i ++ ,j ++ )
72+ for (;j < LINELEN - 1 && s [i ]!= '\0' ;i ++ ,j ++ )
6773{
6874line [j ]= s [i ];
6975switch (line [j ])
7076{
7177case '}' :
72- if (j != indentLev * 3 )
78+ if (j != indentDist )
7379{
80+ /* print data before the } */
7481line [j ]= '\0' ;
7582printf ("%s\n" ,line );
76- line [indentLev * 3 ]= '\0' ;
77- printf ("%s}\n" ,line );
7883}
79- else
84+ /* print the } at indentDist */
85+ line [indentDist ]= '\0' ;
86+ printf ("%s}\n" ,line );
87+ /* outdent */
88+ if (indentLev > 0 )
8089{
81- line [ j ] = '\0' ;
82- printf ( "%s}\n" , line );
90+ indentLev -- ;
91+ indentDist = MIN ( indentLev * INDENTSTOP , MAXINDENT );
8392}
84- indentLev -- ;
85- j = indentLev * 3 - 1 ;/* print the line before :
86- * and resets */
93+ j = indentDist - 1 ;
94+ /* j will equal indentDist on next loop iteration */
8795break ;
8896case ')' :
97+ /* force line break after ')' */
8998line [j + 1 ]= '\0' ;
9099printf ("%s\n" ,line );
91- j = indentLev * 3 - 1 ;
100+ j = indentDist - 1 ;
92101break ;
93102case '{' :
103+ /* force line break before { */
104+ if (j != indentDist )
105+ {
106+ line [j ]= '\0' ;
107+ printf ("%s\n" ,line );
108+ }
109+ /* indent */
94110indentLev ++ ;
95- /* !!! FALLS THROUGH */
111+ indentDist = MIN (indentLev * INDENTSTOP ,MAXINDENT );
112+ for (j = 0 ;j < indentDist ;j ++ )
113+ line [j ]= ' ' ;
114+ line [j ]= s [i ];
115+ break ;
96116case ':' :
97- if (j != 0 )
117+ /* force line break before : */
118+ if (j != indentDist )
98119{
99120line [j ]= '\0' ;
100121printf ("%s\n" ,line );
101- /* print the line before : and resets */
102- for (j = 0 ;j < indentLev * 3 ;j ++ )
103- line [j ]= ' ' ;
104122}
123+ j = indentDist ;
105124line [j ]= s [i ];
106125break ;
107126}
@@ -114,7 +133,7 @@ pprint(void *obj)
114133if (j != 0 )
115134printf ("%s\n" ,line );
116135fflush (stdout );
117- return ;
136+ pfree ( s ) ;
118137}
119138
120139/*
378397print_plan_recursive (Plan * p ,Query * parsetree ,int indentLevel ,char * label )
379398{
380399int i ;
381- char extraInfo [100 ];
400+ char extraInfo [NAMEDATALEN + 100 ];
382401
383402if (!p )
384403return ;