*** a/doc/src/sgml/ref/psql-ref.sgml
--- b/doc/src/sgml/ref/psql-ref.sgml
***************
*** 3316,3321 **** testdb=&gt; <userinput>INSERT INTO my_table VALUES (:'content');</userinput>
--- 3316,3326 ----
        </varlistentry>
  
        <varlistentry>
+         <term><literal>%l</literal></term>
+         <listitem><para>The current line number</para></listitem>
+       </varlistentry>
+ 
+       <varlistentry>
          <term><literal>%</literal><replaceable class="parameter">digits</replaceable></term>
          <listitem>
          <para>
*** a/src/bin/psql/mainloop.c
--- b/src/bin/psql/mainloop.c
***************
*** 8,13 ****
--- 8,14 ----
  #include "postgres_fe.h"
  #include "mainloop.h"
  
+ #include <limits.h>
  
  #include "command.h"
  #include "common.h"
***************
*** 58,63 **** MainLoop(FILE *source)
--- 59,65 ----
  	pset.cur_cmd_source = source;
  	pset.cur_cmd_interactive = ((source == stdin) && !pset.notty);
  	pset.lineno = 0;
+ 	pset.cur_lineno = 1;
  
  	/* Create working state */
  	scan_state = psql_scan_create();
***************
*** 225,230 **** MainLoop(FILE *source)
--- 227,233 ----
  		{
  			PsqlScanResult scan_result;
  			promptStatus_t prompt_tmp = prompt_status;
+ 			char *tmp = line;
  
  			scan_result = psql_scan(scan_state, query_buf, &prompt_tmp);
  			prompt_status = prompt_tmp;
***************
*** 235,240 **** MainLoop(FILE *source)
--- 238,257 ----
  				exit(EXIT_FAILURE);
  			}
  
+ 			/* 
+ 			 * Increase current line number counter with the new lines present
+ 			 * in the line buffer
+ 			 */
+ 			while (*tmp != '\0' && scan_result != PSCAN_INCOMPLETE)
+ 			{
+ 				if (*(tmp++) == '\n')
+ 					pset.cur_lineno++;
+ 			}
+ 
+ 			/* The one new line is always added to tail of query_buf */
+ 			if (scan_result != PSCAN_INCOMPLETE)
+ 				pset.cur_lineno++;
+ 
  			/*
  			 * Send command if semicolon found, or if end of line and we're in
  			 * single-line mode.
***************
*** 256,261 **** MainLoop(FILE *source)
--- 273,279 ----
  				/* execute query */
  				success = SendQuery(query_buf->data);
  				slashCmdStatus = success ? PSQL_CMD_SEND : PSQL_CMD_ERROR;
+ 				pset.cur_lineno = 1;
  
  				/* transfer query to previous_buf by pointer-swapping */
  				{
***************
*** 303,308 **** MainLoop(FILE *source)
--- 321,327 ----
  												 query_buf : previous_buf);
  
  				success = slashCmdStatus != PSQL_CMD_ERROR;
+ 				pset.cur_lineno = 1;
  
  				if ((slashCmdStatus == PSQL_CMD_SEND || slashCmdStatus == PSQL_CMD_NEWEDIT) &&
  					query_buf->len == 0)
*** a/src/bin/psql/prompt.c
--- b/src/bin/psql/prompt.c
***************
*** 44,49 ****
--- 44,50 ----
   *		in prompt2 -, *, ', or ";
   *		in prompt3 nothing
   * %x - transaction status: empty, *, !, ? (unknown or no connection)
+  * %l - the line number
   * %? - the error code of the last query (not yet implemented)
   * %% - a percent sign
   *
***************
*** 229,234 **** get_prompt(promptStatus_t status)
--- 230,238 ----
  						}
  					break;
  
+ 				case 'l':
+ 					sprintf(buf, "%u", pset.cur_lineno);
+ 					break;
  				case '?':
  					/* not here yet */
  					break;
*** a/src/bin/psql/settings.h
--- b/src/bin/psql/settings.h
***************
*** 88,93 **** typedef struct _psqlSettings
--- 88,94 ----
  	const char *progname;		/* in case you renamed psql */
  	char	   *inputfile;		/* file being currently processed, if any */
  	uint64		lineno;			/* also for error reporting */
+ 	uint64		cur_lineno;		/* current line number */
  
  	bool		timing;			/* enable timing of all queries */
  
