patch.diff

application/octet-stream

Filename: patch.diff
Type: application/octet-stream
Part: 0
Message: Re: quoting psql varible as identifier

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: context
File+
./psqlscan.l 174 0
*** ./psqlscan.l.orig	2010-01-02 17:57:59.000000000 +0100
--- ./psqlscan.l	2010-01-21 17:51:33.556758460 +0100
***************
*** 119,124 ****
--- 119,127 ----
  static void emit(const char *txt, int len);
  static bool is_utf16_surrogate_first(uint32 c);
  
+ static void appendLiteral(PGconn *conn, PQExpBuffer buf, const char *str);
+ static void appendIdentifier(PGconn *conn, PQExpBuffer buf, const char *str);
+ 
  #define ECHO emit(yytext, yyleng)
  
  %}
***************
*** 706,711 ****
--- 709,777 ----
  						ECHO;
  					}
  				}
+ 				
+ :'[A-Za-z0-9_]+'	{
+ 					/* 
+ 					* Possible psql variable substitution with 
+ 					* literal escaping.
+ 					*/
+ 					const char *value;
+ 				     
+ 					yytext[yyleng - 1] = '\0';
+ 					value = GetVariable(pset.vars, yytext + 2);
+ 					
+ 					if (value)
+ 					{
+ 						/* It is a variable, perform substitution */
+ 						PQExpBufferData   buf;
+ 						
+ 						initPQExpBuffer(&buf);
+ 						appendLiteral(pset.db, &buf, value);
+ 						push_new_buffer(buf.data);
+ 						termPQExpBuffer(&buf);
+ 						
+ 						/* yy_scan_string already made buffer active */
+ 					}
+ 					else
+ 					{
+ 						/*
+ 						 * if the variable doesn't exist we'll copy the
+ 						 * string as is
+ 						 */
+ 						ECHO;
+ 					}
+ 				}
+ 		
+ :\"[A-Za-z0-9_]+\"	{
+ 					/* 
+ 					* Possible psql variable substitution with 
+ 					* identifier escaping.
+ 					*/
+ 					const char *value;
+ 				     
+ 					yytext[yyleng - 1] = '\0';
+ 					value = GetVariable(pset.vars, yytext + 2);
+ 					
+ 					if (value)
+ 					{
+ 						/* It is a variable, perform substitution */
+ 						PQExpBufferData   buf;
+ 						
+ 						initPQExpBuffer(&buf);
+ 						appendIdentifier(pset.db, &buf, value);
+ 						push_new_buffer(buf.data);
+ 						termPQExpBuffer(&buf);
+ 						/* yy_scan_string already made buffer active */
+ 					}
+ 					else
+ 					{
+ 						/*
+ 						 * if the variable doesn't exist we'll copy the
+ 						 * string as is
+ 						 */
+ 						ECHO;
+ 					}
+ 				}
  
  	/*
  	 * Back to backend-compatible rules.
***************
*** 927,932 ****
--- 993,1052 ----
  					return LEXRES_OK;
  				}
  
+ 
+ :'[A-Za-z0-9_]+'	{
+ 					/* Possible psql variable substitution with literal escaping */
+ 					if (option_type == OT_VERBATIM)
+ 						ECHO;
+ 					else
+ 					{
+ 						const char *value;
+ 						
+ 						yytext[yyleng - 1] = '\0';
+ 						value = GetVariable(pset.vars, yytext + 2);
+ 
+ 						/*
+ 						 * The variable value is just emitted without any
+ 						 * further examination.  This is consistent with the
+ 						 * pre-8.0 code behavior, if not with the way that
+ 						 * variables are handled outside backslash commands.
+ 						 */
+ 						if (value)
+ 							appendLiteral(pset.db, output_buf, value);
+ 					}
+ 
+ 					*option_quote = ':';
+ 
+ 					return LEXRES_OK;
+ 				}
+ 		
+ :\"[A-Za-z0-9_]+\"	{
+ 					/* Possible psql variable substitution with identifier escaping */
+ 					if (option_type == OT_VERBATIM)
+ 						ECHO;
+ 					else
+ 					{
+ 						const char *value;
+ 						
+ 						yytext[yyleng - 1] = '\0';
+ 						value = GetVariable(pset.vars, yytext + 2);
+ 
+ 						/*
+ 						 * The variable value is just emitted without any
+ 						 * further examination.  This is consistent with the
+ 						 * pre-8.0 code behavior, if not with the way that
+ 						 * variables are handled outside backslash commands.
+ 						 */
+ 						if (value)
+ 							appendIdentifier(pset.db, output_buf, value);
+ 					}
+ 
+ 					*option_quote = ':';
+ 
+ 					return LEXRES_OK;
+ 				}
+ 
+ 
  "|"				{
  					ECHO;
  					if (option_type == OT_FILEPIPE)
***************
*** 1740,1742 ****
--- 1860,1916 ----
  {
  	return (c >= 0xD800 && c <= 0xDBFF);
  }
+ 
+ /*
+  * Convert a string value to an SQL Literal and append it to
+  * the given buffer.
+  */
+ static void
+ appendLiteral(PGconn *conn, PQExpBuffer buf, const char *str)
+ {
+ 	char	*escaped_str;
+ 	size_t		len;
+ 	
+ 	len = strlen(str);
+ 	escaped_str = PQescapeLiteral(conn, str, len);
+ 	
+ 	if (escaped_str == NULL)
+ 	{
+ 		const char *error_message = PQerrorMessage(pset.db);
+ 
+ 		if (strlen(error_message))
+ 			psql_error("%s", error_message);
+ 	}
+ 	else
+ 	{
+ 		appendPQExpBufferStr(buf, escaped_str);
+ 		free(escaped_str);
+ 	}
+ }
+ 
+ /*
+  * Convert a string value to an SQL identifier and append it to
+  * the given buffer.
+  */
+ static void
+ appendIdentifier(PGconn *conn, PQExpBuffer buf, const char *str)
+ {
+ 	char	*escaped_str;
+ 	size_t		len;
+ 	
+ 	len = strlen(str);
+ 	escaped_str = PQescapeIdentifier(conn, str, len);
+ 	
+ 	if (escaped_str == NULL)
+ 	{
+ 		const char *error_message = PQerrorMessage(pset.db);
+ 
+ 		if (strlen(error_message))
+ 			psql_error("%s", error_message);
+ 	}
+ 	else
+ 	{
+ 		appendPQExpBufferStr(buf, escaped_str);
+ 		free(escaped_str);
+ 	}
+ }