mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Properly handle empty arrays returned from plperl functions.
Bug reported by David Wheeler, fix by Alex Hunsaker. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: src/pl/plperl/plperl.c # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # autom4te.cache/ # configure.in~ # doc/src/sgml/ref/grant.sgml~ # src/backend/port/win32_latch.c~ # src/bin/psql/command.c~ # src/include/pg_config.h.win32~ # src/pl/plpython/plpython.c~ # src/tools/msvc/pgbison.bat~ # src/tools/msvc/pgbison.pl.bak # src/tools/msvc/pgflex.bat~ # src/tools/msvc/pgflex.pl.bak # src/tools/pgindent/README~ # src/tools/pgindent/pgindent.pl # src/tools/pgindent/pgindent.pl~ # xxxxx # yyyyyy
This commit is contained in:
		@@ -1077,14 +1077,15 @@ _array_to_datum(AV *av, int *ndims, int *dims, int cur_depth,
 | 
				
			|||||||
	int			i = 0;
 | 
						int			i = 0;
 | 
				
			||||||
	int			len = av_len(av) + 1;
 | 
						int			len = av_len(av) + 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (len == 0)
 | 
					 | 
				
			||||||
		astate = accumArrayResult(astate, (Datum) 0, true, atypid, NULL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for (i = 0; i < len; i++)
 | 
						for (i = 0; i < len; i++)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							/* fetch the array element */
 | 
				
			||||||
		SV		  **svp = av_fetch(av, i, FALSE);
 | 
							SV		  **svp = av_fetch(av, i, FALSE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* see if this element is an array, if so get that */
 | 
				
			||||||
		SV		   *sav = svp ? get_perl_array_ref(*svp) : NULL;
 | 
							SV		   *sav = svp ? get_perl_array_ref(*svp) : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* multi-dimensional array? */
 | 
				
			||||||
		if (sav)
 | 
							if (sav)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			AV		   *nav = (AV *) SvRV(sav);
 | 
								AV		   *nav = (AV *) SvRV(sav);
 | 
				
			||||||
@@ -1148,6 +1149,9 @@ plperl_array_to_datum(SV *src, Oid typid)
 | 
				
			|||||||
	astate = _array_to_datum((AV *) SvRV(src), &ndims, dims, 1, astate, typid,
 | 
						astate = _array_to_datum((AV *) SvRV(src), &ndims, dims, 1, astate, typid,
 | 
				
			||||||
							 atypid);
 | 
												 atypid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!astate)
 | 
				
			||||||
 | 
							return PointerGetDatum(construct_empty_array(atypid));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < ndims; i++)
 | 
						for (i = 0; i < ndims; i++)
 | 
				
			||||||
		lbs[i] = 1;
 | 
							lbs[i] = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user