Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vrzIb-00GWMk-1l for pgsql-hackers@arkaria.postgresql.org; Mon, 16 Feb 2026 14:10:05 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vrzIa-002gSY-0Y for pgsql-hackers@arkaria.postgresql.org; Mon, 16 Feb 2026 14:10:04 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vrzIZ-002gSN-2R for pgsql-hackers@lists.postgresql.org; Mon, 16 Feb 2026 14:10:04 +0000 Received: from mail-ej1-x641.google.com ([2a00:1450:4864:20::641]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vrzIW-00000000tnr-0AYn for pgsql-hackers@postgresql.org; Mon, 16 Feb 2026 14:10:02 +0000 Received: by mail-ej1-x641.google.com with SMTP id a640c23a62f3a-b885e8c6727so496744166b.1 for ; Mon, 16 Feb 2026 06:10:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1771250999; cv=none; d=google.com; s=arc-20240605; b=KLKSrBZ452aV7PFJN7IF3ituaF9FDSDNJcGwlsUIRwrwJn/W+fixcbra73nwxEcFxA TmWG1Ro9S3eNymDVEO7WiKAcZ2xdTRAUUMCu68LQVE4mR4WTvDMLEHhdKj+C6O0G94Ml 2FvYlkQMqMLcSs2pMBc0ajEsAt83y6GdY4j+NPYbYJYUfLx7j9FtQVXcJ8n55QDgMH/I BJ3a7anRVJkQnEfva6zy1uswJYAo2dT8ST36j212MOYMhZPsBn0hlo40gqSZhhucdK4j 2+WxQS4vb5yG0uPAPvoQa4aFL+vnPbl+psGt17cDcvvXAAlI7xA5YI2KqDSnx5MM2Llg q4xQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=rDq8GGvOl7tY14PK9F/26dnN2e/YfXVYi02MDOJRn9Y=; fh=RfrkJab44jNT7RraF/sJO97r9/nkUL0AAgzmC7PBS2w=; b=IxxE/Z8QFCRZH9McpVSiUWv1vrsd3SeuRsHFfKNmlNgR8hNnWKzPlcPyx2Zn5AKrZC VaUVDmveE3PQcUYQ2+M+HuMrJT6jq7Cf7HE2leEVBf7rZDiiGFUASJh4J9FuO1ynrzlj GNOvDCpQZUbi3qOlR+oL0xUnMzVoPuWiFYB/7bJ5qQo9mZST8QAyd1YUlovpU41+wv16 IdI+nvIfyVWd5tW/RUTI2o0CVoV4oI81AxNcrFoW6TlkN1FFYIyIa65BS0X9CcfELS7L oYlajpYkECDTHWTEe2WHevUKa7DouXhRR1LEQFQE5deID9uHflO8AwmKAMV7OmuqJQuO z2Ng==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; t=1771250999; x=1771855799; darn=postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=rDq8GGvOl7tY14PK9F/26dnN2e/YfXVYi02MDOJRn9Y=; b=PthyUGZSrfjVg5gAP81fLDc1lXYPVEp34MsAuWGR01ZsHICyMvwDKjF9CnuQdfqkkU Cie/cJJW52ZkKvyQ4EeWQ9A28bTiRZX7t/il5ttj0FzHD4XlLNCJC9gh5/CZyFVPGZ7O m09rhuBiXSstQdOMv3kiZSvzeEcMW9KbMLPbioVY1Xfbl3scDvfRCgsPH7SBE0PcdLT7 odPFoJqFEyLnD0aqBETPlkvd0nwvSW8oUQgOYbOTsdHilO52KN46eVO5WCzIWl+LMBij ZtmOCdVqJpnLbO11RhmDCSdva06Gh77S1X5+gpF/iHcsU6AM0iNQEI0Eplc4M21eAI7r pTdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771250999; x=1771855799; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=rDq8GGvOl7tY14PK9F/26dnN2e/YfXVYi02MDOJRn9Y=; b=dRmHaOlt64l6aFnSo+V1oeYomslEjKWGKzoBfU93a6EUrYUp6vD9rNiqYWw/5wja8S BswbsW83q9WwPw3B5UrdNhIshNWuXJNPE4LWrbKjUNdBOM9SMIg6pYqbftvXXzjQkXG2 PYaK2StfTE/dPjfI0lsE9xhParMsLQXhwRRytVzfld33wuDa4j6Q4G0v+5WZQAwsJVWz +g3NTbZMkd1hLkgKG/G43avUShuFP2bQcAZbuF0IwHIbZbGDwvj8UAiLU0PuiukHR+G/ Olc7WI4FTGQCzZFqdJ3yX3och0Xr/6s3c+dYyuhe1Ar+sgPtzSpbkTuFsIABcnTvh/33 scYg== X-Gm-Message-State: AOJu0YxL8p0C9aRbys8yNetdlbqYWzgQ/p7uAu7uSh/FBqjmwumJ65DN k4dEyFM2KcioaPhAASmMkZPei1RsQRPJqrUDGhTnPGB4H75jNzU8Gg+GBMU9RGvVy0Cf2EBACVZ cJPDsHqcxGNpL3PJArWA/i5g4idydFpNAj1b0RvPrUPkz2oB8TqqieZ9bF2DbRg== X-Gm-Gg: AZuq6aKwQ40MRs41QVFwqzE97HEoV8+lovrGMOmmLoBk7iKSgQIHAwkoIWhHvhtRn/U 2wKF11GO1p7rctAFz8If0TD6RFqLUf5cbfhA5UM/y6a90UsWyXsmXU/jr2oFP+TWJRDQIvbiTZ5 /fbs4Y72NvRW3OlUUZcvGGa8w+F1XGw/ZjRKUej6HLyxi3knvRSA3vDKi/1zjFpzqA8m8TlvOON Zwxa6wr9xl7vyZ7JFuQf4VxwWJjkgM8Lismlyz2x/RO+XZIN/iLlrmOgWu4cALIVqx2LmysptsU b3JOss9i X-Received: by 2002:a17:907:c0a:b0:b88:58e5:86ff with SMTP id a640c23a62f3a-b8fc0216b5emr673427666b.0.1771250998380; Mon, 16 Feb 2026 06:09:58 -0800 (PST) MIME-Version: 1.0 From: Akshay Joshi Date: Mon, 16 Feb 2026 19:39:46 +0530 X-Gm-Features: AaiRm52s7J_wdnuaQzhY4OvRC7OZf_XN89viwOSad5ees6g2DPlKAvj0cZfX5JY Message-ID: Subject: [PATCH] pgindent truncates last line of files missing a trailing newline To: pgsql-hackers Content-Type: multipart/mixed; boundary="000000000000918c2c064af18271" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000918c2c064af18271 Content-Type: multipart/alternative; boundary="000000000000918c2a064af1826f" --000000000000918c2a064af1826f Content-Type: text/plain; charset="UTF-8" Hi Hackers, I have encountered a bug in "*src/tools/pg_bsd_indent/lexi.c"* where pgindent was incorrectly dropping the final line of a file if that line did not end with a newline character (\n). This occurred because the EOF logic triggered a termination of the processing loop before the remaining buffer was flushed to the output. *Steps to Reproduce:* 1. Create a *header/c* file with some content but no newline at the very end. 2. Run pgindent on those files. 3. Check the file content. The file is now empty or missing the last line. This patch ensures that had_eof states do not bypass the final buffer processing, preserving the integrity of the source code regardless of trailing whitespace. Akshay Joshi Principal Engineer | Engineering Manager | pgAdmin Hacker enterprisedb.com * Blog*: https://www.enterprisedb.com/akshay-joshi * GitHub*: https://github.com/akshay-joshi * LinkedIn*: https:// www.linkedin.com/in/akshay-joshi-a9317b14 --000000000000918c2a064af1826f Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Hackers,

I have encountered a bug in "= src/tools/pg_bsd_indent/lexi.c"=C2=A0where pgindent was incorre= ctly dropping the final line of a file if that line did not end with a newl= ine character (\n). This occurred because the EOF logic triggered a termina= tion of the processing loop before the remaining buffer was flushed to the = output.

Steps to Reproduce:
  1. Create a header/c file with some content but no newline at the very end.
  2. Run pgind= ent on those files.
  3. Check the file content. The file is now empty o= r missing the last line.
This patch ensures that had_eo= f states do not bypass the final buffer processing, preserving the integrit= y of the source code regardless of trailing whitespace.

<= div dir=3D"ltr" class=3D"gmail_signature" data-smartmail=3D"gmail_signature= ">


Akshay Joshi

Principal Engineer | Engineering Manager | pgA= dmin Hacker

= enterprisedb.co= m


=C2=A0 Blog:= ht= tps://www.enterprisedb.com/akshay-joshi
=C2=A0 GitHub: https://github.com/a= kshay-joshi
=C2=A0 LinkedIn: https://www.linkedin.com/in/akshay-joshi-a9317b14
--000000000000918c2a064af1826f-- --000000000000918c2c064af18271 Content-Type: application/octet-stream; name="0001-Fix-pgindent-truncates-last-line-of-files.patch" Content-Disposition: attachment; filename="0001-Fix-pgindent-truncates-last-line-of-files.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mlp8ynct0 RnJvbSA1YmI1NmUxZTYwM2E4ZWE5OGE1ZjEzYjdhYmRhYTVmMjUyYjMxNzBmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBa3NoYXkgSm9zaGkgPGFrc2hheS5qb3NoaUBlbnRlcnByaXNl ZGIuY29tPgpEYXRlOiBNb24sIDE2IEZlYiAyMDI2IDE2OjM5OjA4ICswNTMwClN1YmplY3Q6IFtQ QVRDSF0gRml4IHBnaW5kZW50IHRydW5jYXRlcyBsYXN0IGxpbmUgb2YgZmlsZXMgbWlzc2luZyBh IHRyYWlsaW5nCiBuZXdsaW5lLgoKcGdpbmRlbnQgd2FzIGluY29ycmVjdGx5IGRyb3BwaW5nIHRo ZSBmaW5hbCBsaW5lIG9mIGEgZmlsZSBpZiB0aGF0IGxpbmUKZGlkIG5vdCBlbmQgd2l0aCBhIG5l d2xpbmUgY2hhcmFjdGVyIChcbikuIFRoaXMgb2NjdXJyZWQgYmVjYXVzZSB0aGUgRU9GCmxvZ2lj IHRyaWdnZXJlZCBhIHRlcm1pbmF0aW9uIG9mIHRoZSBwcm9jZXNzaW5nIGxvb3AgYmVmb3JlIHRo ZSByZW1haW5pbmcKYnVmZmVyIHdhcyBmbHVzaGVkIHRvIHRoZSBvdXRwdXQuCgpUaGlzIHBhdGNo IGVuc3VyZXMgdGhhdCBoYWRfZW9mIHN0YXRlcyBkbyBub3QgYnlwYXNzIHRoZSBmaW5hbCBidWZm ZXIKcHJvY2Vzc2luZywgcHJlc2VydmluZyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBzb3VyY2UgY29k ZSByZWdhcmRsZXNzIG9mIHRyYWlsaW5nCndoaXRlc3BhY2UuCi0tLQogc3JjL3Rvb2xzL3BnX2Jz ZF9pbmRlbnQvbGV4aS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQgKysrLQogc3Jj L3Rvb2xzL3BnX2JzZF9pbmRlbnQvdGVzdHMvbm9fdHJhaWxpbmdfbmV3bGluZS4wICAgICAgICB8 IDQgKysrKwogc3JjL3Rvb2xzL3BnX2JzZF9pbmRlbnQvdGVzdHMvbm9fdHJhaWxpbmdfbmV3bGlu ZS4wLnN0ZG91dCB8IDYgKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDEzIGluc2VydGlvbnMoKyks IDEgZGVsZXRpb24oLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdG9vbHMvcGdfYnNkX2luZGVu dC90ZXN0cy9ub190cmFpbGluZ19uZXdsaW5lLjAKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdG9v bHMvcGdfYnNkX2luZGVudC90ZXN0cy9ub190cmFpbGluZ19uZXdsaW5lLjAuc3Rkb3V0CgpkaWZm IC0tZ2l0IGEvc3JjL3Rvb2xzL3BnX2JzZF9pbmRlbnQvbGV4aS5jIGIvc3JjL3Rvb2xzL3BnX2Jz ZF9pbmRlbnQvbGV4aS5jCmluZGV4IDk0M2JmN2NlNmIwLi4zZTQ2MzA5YjI1NyAxMDA2NDQKLS0t IGEvc3JjL3Rvb2xzL3BnX2JzZF9pbmRlbnQvbGV4aS5jCisrKyBiL3NyYy90b29scy9wZ19ic2Rf aW5kZW50L2xleGkuYwpAQCAtMjE5LDYgKzIxOSw3IEBAIGxleGkoc3RydWN0IHBhcnNlcl9zdGF0 ZSAqc3RhdGUpCiAJCQkJICogZm9yY2VzIGEgZm9sbG93aW5nIG9wZXJhdG9yIHRvIGJlIHVuYXJ5 ICovCiAgICAgaW50ICAgICAgICAgY29kZTsJCS8qIGludGVybmFsIGNvZGUgdG8gYmUgcmV0dXJu ZWQgKi8KICAgICBjaGFyICAgICAgICBxY2hhcjsJCS8qIHRoZSBkZWxpbWl0ZXIgY2hhcmFjdGVy IGZvciBhIHN0cmluZyAqLworICAgIGludCAgICAgICAgIGVvZl9iZWZvcmVfZmlsbDsJLyogaGFk X2VvZiBiZWZvcmUgZmlsbF9idWZmZXIoKSBjYWxsICovCiAKICAgICBlX3Rva2VuID0gc190b2tl bjsJCS8qIHBvaW50IHRvIHN0YXJ0IG9mIHBsYWNlIHRvIHNhdmUgdG9rZW4gKi8KICAgICB1bmFy eV9kZWxpbSA9IGZhbHNlOwpAQCAtNDQ2LDYgKzQ0Nyw3IEBAIGxleGkoc3RydWN0IHBhcnNlcl9z dGF0ZSAqc3RhdGUpCiAgICAgKmVfdG9rZW4rKyA9ICpidWZfcHRyOwkJLyogaWYgaXQgaXMgb25s eSBhIG9uZS1jaGFyYWN0ZXIgdG9rZW4sIGl0IGlzCiAJCQkJICogbW92ZWQgaGVyZSAqLwogICAg ICplX3Rva2VuID0gJ1wwJzsKKyAgICBlb2ZfYmVmb3JlX2ZpbGwgPSBoYWRfZW9mOwogICAgIGlm ICgrK2J1Zl9wdHIgPj0gYnVmX2VuZCkKIAlmaWxsX2J1ZmZlcigpOwogCkBAIC00NTMsNyArNDU1 LDcgQEAgbGV4aShzdHJ1Y3QgcGFyc2VyX3N0YXRlICpzdGF0ZSkKICAgICBjYXNlICdcbic6CiAJ dW5hcnlfZGVsaW0gPSBzdGF0ZS0+bGFzdF91X2Q7CiAJc3RhdGUtPmxhc3RfbmwgPSB0cnVlOwkv KiByZW1lbWJlciB0aGF0IHdlIGp1c3QgaGFkIGEgbmV3bGluZSAqLwotCWNvZGUgPSAoaGFkX2Vv ZiA/IDAgOiBuZXdsaW5lKTsKKwljb2RlID0gKGVvZl9iZWZvcmVfZmlsbCA/IDAgOiBuZXdsaW5l KTsKIAogCS8qCiAJICogaWYgZGF0YSBoYXMgYmVlbiBleGhhdXN0ZWQsIHRoZSBuZXdsaW5lIGlz IGEgZHVtbXksIGFuZCB3ZSBzaG91bGQKZGlmZiAtLWdpdCBhL3NyYy90b29scy9wZ19ic2RfaW5k ZW50L3Rlc3RzL25vX3RyYWlsaW5nX25ld2xpbmUuMCBiL3NyYy90b29scy9wZ19ic2RfaW5kZW50 L3Rlc3RzL25vX3RyYWlsaW5nX25ld2xpbmUuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMDAwMC4uMzIzMzk5MGUxMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdG9vbHMvcGdf YnNkX2luZGVudC90ZXN0cy9ub190cmFpbGluZ19uZXdsaW5lLjAKQEAgLTAsMCArMSw0IEBACisv KiBUZXN0OiBmaWxlIHdpdGhvdXQgdHJhaWxpbmcgbmV3bGluZSAqLwordm9pZCB0ZXN0KHZvaWQp IHsKK2ludCB4ID0gMTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQg YS9zcmMvdG9vbHMvcGdfYnNkX2luZGVudC90ZXN0cy9ub190cmFpbGluZ19uZXdsaW5lLjAuc3Rk b3V0IGIvc3JjL3Rvb2xzL3BnX2JzZF9pbmRlbnQvdGVzdHMvbm9fdHJhaWxpbmdfbmV3bGluZS4w LnN0ZG91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYzYzMmQ2MmYx NmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdG9vbHMvcGdfYnNkX2luZGVudC90ZXN0cy9ub190 cmFpbGluZ19uZXdsaW5lLjAuc3Rkb3V0CkBAIC0wLDAgKzEsNiBAQAorLyogVGVzdDogZmlsZSB3 aXRob3V0IHRyYWlsaW5nIG5ld2xpbmUgKi8KK3ZvaWQKK3Rlc3Qodm9pZCkKK3sKKwlpbnQJCXgg PSAxOworfQotLSAKMi41MS4wCgo= --000000000000918c2c064af18271--