postgresql/src/tools/pgindent
Alexander Korotkov ad458d0cd9 Improve handling of NULLs in KNN-GiST and KNN-SP-GiST
This commit improves subject in two ways:

 * It removes ugliness of 02f90879e7, which stores distance values and null
   flags in two separate arrays after GISTSearchItem struct.  Instead we pack
   both distance value and null flag in IndexOrderByDistance struct.  Alignment
   overhead should be negligible, because we typically deal with at most few
   "col op const" expressions in ORDER BY clause.
 * It fixes handling of "col op NULL" expression in KNN-SP-GiST.  Now, these
   expression are not passed to support functions, which can't deal with them.
   Instead, NULL result is implicitly assumed.  It future we may decide to
   teach support functions to deal with NULL arguments, but current solution is
   bugfix suitable for backpatch.

Reported-by: Nikita Glukhov
Discussion: https://postgr.es/m/826f57ee-afc7-8977-c44c-6111d18b02ec%40postgrespro.ru
Author: Nikita Glukhov
Reviewed-by: Alexander Korotkov
Backpatch-through: 9.4
2019-09-19 22:09:51 +03:00
..
exclude_file_patterns Revert 9.5 pgindent changes to atomics directory files 2015-05-24 21:45:01 -04:00
indent.bsd.patch Fix pg_bsd_indent bug where newlines were not being trimmed from typedef 2011-10-26 17:24:19 -04:00
perltidyrc Remove whitespace from end of lines 2013-05-30 21:05:07 -04:00
pgcppindent Remove cvs keywords from all files. 2010-09-20 22:08:53 +02:00
pgindent Update URLs in pgindent source and README 2017-05-23 14:02:24 -04:00
pgindent.man Fix whitespace issues found by git diff --check, add gitattributes 2013-11-10 14:48:29 -05:00
README Update URLs in pgindent source and README 2017-05-23 14:02:24 -04:00
typedefs.list Improve handling of NULLs in KNN-GiST and KNN-SP-GiST 2019-09-19 22:09:51 +03:00

pgindent
========

This can format all PostgreSQL *.c and *.h files, but excludes *.y, and
*.l files.

1) Install pg_bsd_indent (see below for details).

2) Install entab (src/tools/entab/).

3) Change directory to the top of the build tree.

4) Remove all derived files (pgindent has trouble with one of the flex macros):

	make maintainer-clean

   Or:

	git clean -fdx

5) Download the typedef file from the buildfarm:

	wget -O src/tools/pgindent/typedefs.list https://buildfarm.postgresql.org/cgi-bin/typedefs.pl

   (see http://www.pgbuildfarm.org/cgi-bin/typedefs.pl?show_list for a full list of typedefs,
    also http://adpgtech.blogspot.com/2015/05/running-pgindent-on-non-core-code-or.html)

6) Run pgindent:

	src/tools/pgindent/pgindent

7) Remove any files that generate errors and restore their original
   versions.

8) Indent the Perl code:

	(
		find . -name \*.pl -o -name \*.pm

		find . -type f -exec file {} \; |
		egrep -i ':.*perl[0-9]*\>' |
		cut -d: -f1
	) |
	sort -u |
	xargs perltidy --profile=src/tools/pgindent/perltidyrc

9) Do a full test build:

	> run configure
	# stop is only necessary if it's going to install in a location with an
	# already running server
	pg_ctl stop
	run configure
	make -C src install
	make -C contrib install
	run initdb
	pg_ctl start
	make installcheck-world

10) Remove Perl backup files after testing (*.bak)

---------------------------------------------------------------------------

BSD indent
----------

We have standardized on NetBSD's indent, and renamed it pg_bsd_indent.
We have fixed a few bugs which requre the NetBSD source to be patched
with indent.bsd.patch patch.  A fully patched version is available at
https://ftp.postgresql.org/pub/dev.

GNU indent, version 2.2.6, has several problems, and is not recommended.
These bugs become pretty major when you are doing >500k lines of code.
If you don't believe me, take a directory and make a copy.  Run pgindent
on the copy using GNU indent, and do a diff -r. You will see what I
mean. GNU indent does some things better, but mangles too.  For details,
see:

	http://archives.postgresql.org/pgsql-hackers/2003-10/msg00374.php
	http://archives.postgresql.org/pgsql-hackers/2011-04/msg01436.php

---------------------------------------------------------------------------

Notes about excluded files
--------------------------

src/include/storage/s_lock.h and src/include/port/atomics/ are excluded
because they contain assembly code that pgindent tends to mess up.

src/include/snowball/libstemmer/ and src/backend/snowball/libstemmer/
are excluded because those files are imported from an external project,
not maintained locally, and are machine-generated anyway.

src/interfaces/ecpg/test/expected/ is excluded to avoid breaking the ecpg
regression tests.  Several *.h files are included in regression output so
should not be changed.

---------------------------------------------------------------------------

Obsolete typedef list creation instructions
-------------------------------------------

To use pgindent:

1) Build the source tree with _debug_ symbols and all possible configure options

2) Install to /usr/local/pgsql

3) Install all contrib modules

4) Save a list of typedefs by running:

	src/tools/find_typedef /usr/local/pgsql/bin /usr/local/pgsql/lib > /tmp/pgtypedefs