diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c
index 9d84b79..b4b9286 100644
*** a/src/backend/commands/extension.c
--- b/src/backend/commands/extension.c
*************** typedef struct ExtensionVersionInfo
*** 96,102 ****
--- 96,110 ----
  	struct ExtensionVersionInfo *previous;		/* current best predecessor */
  } ExtensionVersionInfo;
  
+ /* State needed by script_error_callback */
+ typedef struct
+ {
+ 	const char *script;
+ 	const char *filename;
+ }	script_error_callback_arg;
+ 
  /* Local functions */
+ static void script_error_callback(void *arg);
  static List *find_update_path(List *evi_list,
  				 ExtensionVersionInfo *evi_start,
  				 ExtensionVersionInfo *evi_target,
*************** read_extension_script_file(const Extensi
*** 682,692 ****
--- 690,713 ----
  static void
  execute_sql_string(const char *sql, const char *filename)
  {
+ 	script_error_callback_arg callback_arg;
+ 	ErrorContextCallback sqlerrcontext;
  	List	   *raw_parsetree_list;
  	DestReceiver *dest;
  	ListCell   *lc1;
  
  	/*
+ 	 * Setup error traceback support for ereport().
+ 	 */
+ 	callback_arg.script = sql;
+ 	callback_arg.filename = filename;
+ 
+ 	sqlerrcontext.callback = script_error_callback;
+ 	sqlerrcontext.arg = (void *) &callback_arg;
+ 	sqlerrcontext.previous = error_context_stack;
+ 	error_context_stack = &sqlerrcontext;
+ 
+ 	/*
  	 * Parse the SQL string into a list of raw parse trees.
  	 */
  	raw_parsetree_list = pg_parse_query(sql);
*************** execute_sql_string(const char *sql, cons
*** 755,765 ****
--- 776,809 ----
  		}
  	}
  
+ 	error_context_stack = sqlerrcontext.previous;
+ 
  	/* Be sure to advance the command counter after the last script command */
  	CommandCounterIncrement();
  }
  
  /*
+  * error context callback for errors within an extension script
+  */
+ static void
+ script_error_callback(void *arg)
+ {
+ 	script_error_callback_arg *callback_arg = (script_error_callback_arg *) arg;
+ 	int			syntaxerrposition;
+ 
+ 	/* If it's a syntax error, convert to internal syntax error report */
+ 	syntaxerrposition = geterrposition();
+ 	if (syntaxerrposition > 0)
+ 	{
+ 		errposition(0);
+ 		internalerrposition(syntaxerrposition);
+ 		internalerrquery(callback_arg->script);
+ 	}
+ 
+ 	errcontext("extension script file \"%s\"", callback_arg->filename);
+ }
+ 
+ /*
   * Execute the appropriate script file for installing or updating the extension
   *
   * If from_version isn't NULL, it's an update
