Обсуждение: Server crash during simple c-language function

Поиск
Список
Период
Сортировка

Server crash during simple c-language function

От
Tomáš Kovářík
Дата:
Hi,

I'm resending it to here, since I didn't got no response from the
"general" group.

I am trying to create a simple c-language function for "PostgreSQL
8.4.4, compiled by Visual C++ build 1400, 32-bit" running on Windows 7
(32-bit). It works, until I use a SPI.

1) CRASH: I successfully execute a simple query using SPI_exec(), but
when getting the result, it crashes:
SPI_getvalue(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1);
I tried to look wherever I could, but I have no idea what could go wrong.

2) NOT COMPILE: When I want to read value of global SPI_result, I
cannot compile - unresolved external symbol "_SPI_result". I am
currently linking with 'postgres.lib" and I haven't found anything
else what to link with additionally. Compiling using Visual Studio
2008, C/C++ project set to compile for "C".

Can anybody point out, what I am doing wrong?
The complete code and project are below.

Thanks, Tomas

======================== CODE =============
#define BUILDING_DLL 1

#include "postgres.h"
#include "fmgr.h"
#include "executor/spi.h"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(crash_repro);


__declspec (dllexport)
Datum crash_repro(PG_FUNCTION_ARGS)
{int exec_result;
SPI_connect();
exec_result = SPI_exec("select 'test'", 0);
elog(NOTICE, "exect_result_state = %i", exec_result);elog(NOTICE, "SPI_processed = %u", SPI_processed);
if ((SPI_processed > 0) && (SPI_tuptable != NULL)){    elog(NOTICE, "SPI_tuptable is not NULL");
SPI_getvalue(SPI_tuptable->vals[0],SPI_tuptable->tupdesc, 1);}
 
SPI_finish();
PG_RETURN_NULL();
}

===================== VISUAL STUDIO PROJECT ===============
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProjectProjectType="Visual
C++"Version="9.00"Name="Crash"ProjectGUID="{39593D6A-2797-4680-8C97-88008C640B2D}"RootNamespace="Crash"Keyword="Win32Proj"TargetFrameworkVersion="196613"><Platforms>
  <Platform        Name="Win32"    /></Platforms><ToolFiles></ToolFiles><Configurations>    <Configuration
Name="Debug|Win32"       OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"       ConfigurationType="2"        CharacterSet="1"        >        <Tool
         Name="VCPreBuildEventTool"        />        <Tool            Name="VCCustomBuildTool"        />        <Tool
        Name="VCXMLDataGeneratorTool"        />        <Tool            Name="VCWebServiceProxyGeneratorTool"        />
      <Tool            Name="VCMIDLTool"        />        <Tool            Name="VCCLCompilerTool"
Optimization="0"           PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL"            MinimalRebuild="true"
      BasicRuntimeChecks="3"            RuntimeLibrary="3"            UsePrecompiledHeader="0"
WarningLevel="3"           DebugInformationFormat="4"            CompileAs="1"        />        <Tool
Name="VCManagedResourceCompilerTool"       />        <Tool            Name="VCResourceCompilerTool"        />
<Tool           Name="VCPreLinkEventTool"        />        <Tool            Name="VCLinkerTool"
AdditionalDependencies=""c:\Program
Files\PostgreSQL\8.4\lib\postgres.lib""            LinkIncremental="2"            GenerateDebugInformation="true"
         SubSystem="2"            TargetMachine="1"        />        <Tool            Name="VCALinkTool"        />
 <Tool            Name="VCManifestTool"        />        <Tool            Name="VCXDCMakeTool"        />        <Tool
        Name="VCBscMakeTool"        />        <Tool            Name="VCFxCopTool"        />        <Tool
Name="VCAppVerifierTool"       />        <Tool            Name="VCPostBuildEventTool"        />    </Configuration>
<Configuration       Name="Release|Win32"        OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"       ConfigurationType="2"        CharacterSet="1"
WholeProgramOptimization="1"       >        <Tool            Name="VCPreBuildEventTool"        />        <Tool
 Name="VCCustomBuildTool"        />        <Tool            Name="VCXMLDataGeneratorTool"        />        <Tool
   Name="VCWebServiceProxyGeneratorTool"        />        <Tool            Name="VCMIDLTool"        />        <Tool
      Name="VCCLCompilerTool"            Optimization="2"            EnableIntrinsicFunctions="true"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;CRASH_EXPORTS"           RuntimeLibrary="2"
EnableFunctionLevelLinking="true"           UsePrecompiledHeader="2"            WarningLevel="3"
DebugInformationFormat="3"       />        <Tool            Name="VCManagedResourceCompilerTool"        />        <Tool
          Name="VCResourceCompilerTool"        />        <Tool            Name="VCPreLinkEventTool"        />
<Tool           Name="VCLinkerTool"            LinkIncremental="1"            GenerateDebugInformation="true"
SubSystem="2"            OptimizeReferences="2"            EnableCOMDATFolding="2"            TargetMachine="1"
/>       <Tool            Name="VCALinkTool"        />        <Tool            Name="VCManifestTool"        />
<Tool           Name="VCXDCMakeTool"        />        <Tool            Name="VCBscMakeTool"        />        <Tool
     Name="VCFxCopTool"        />        <Tool            Name="VCAppVerifierTool"        />        <Tool
Name="VCPostBuildEventTool"       />    </Configuration></Configurations><References></References><Files>    <Filter
   Name="Source Files"        Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"       >        <File            RelativePath=".\Crash.cpp"
       >        </File>    </Filter>    <Filter        Name="Header Files"        Filter="h;hpp;hxx;hm;inl;inc;xsd"
  UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"        >    </Filter>    <Filter        Name="Resource
Files"       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"       >    </Filter></Files><Globals></Globals>
 
</VisualStudioProject>


Re: Server crash during simple c-language function

От
Robert Haas
Дата:
2010/9/15 Tomáš Kovářík <kovarik.tomas@gmail.com>:
> I am trying to create a simple c-language function for "PostgreSQL
> 8.4.4, compiled by Visual C++ build 1400, 32-bit" running on Windows 7
> (32-bit). It works, until I use a SPI.
>
> 1) CRASH: I successfully execute a simple query using SPI_exec(), but
> when getting the result, it crashes:
> SPI_getvalue(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1);
> I tried to look wherever I could, but I have no idea what could go wrong.
>
> 2) NOT COMPILE: When I want to read value of global SPI_result, I
> cannot compile - unresolved external symbol "_SPI_result". I am
> currently linking with 'postgres.lib" and I haven't found anything
> else what to link with additionally. Compiling using Visual Studio
> 2008, C/C++ project set to compile for "C".
>
> Can anybody point out, what I am doing wrong?
> The complete code and project are below.

I tried your example on MacOS X and it worked OK, so it's probably
some bit of Windows-specific weirdness, but unfortunately my
Windows-fu is pretty poor, so I can't speculate...

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise Postgres Company


Re: Server crash during simple c-language function

От
Tomáš Kovářík
Дата:
Thanks Robert for the test on MacOS X. I wanted to be sure that it is
not only my installation issue, so I tried the same on Windows Server
2003 with PostgreSQL 8.3; the same crash. Is there anybody who has
written a C-function on Windows platform?

Tomas

2010/9/15 Robert Haas <robertmhaas@gmail.com>:
> 2010/9/15 Tomáš Kovářík <kovarik.tomas@gmail.com>:
>> I am trying to create a simple c-language function for "PostgreSQL
>> 8.4.4, compiled by Visual C++ build 1400, 32-bit" running on Windows 7
>> (32-bit). It works, until I use a SPI.
>>
>> 1) CRASH: I successfully execute a simple query using SPI_exec(), but
>> when getting the result, it crashes:
>> SPI_getvalue(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1);
>> I tried to look wherever I could, but I have no idea what could go wrong.
>>
>> 2) NOT COMPILE: When I want to read value of global SPI_result, I
>> cannot compile - unresolved external symbol "_SPI_result". I am
>> currently linking with 'postgres.lib" and I haven't found anything
>> else what to link with additionally. Compiling using Visual Studio
>> 2008, C/C++ project set to compile for "C".
>>
>> Can anybody point out, what I am doing wrong?
>> The complete code and project are below.
>
> I tried your example on MacOS X and it worked OK, so it's probably
> some bit of Windows-specific weirdness, but unfortunately my
> Windows-fu is pretty poor, so I can't speculate...
>
> --
> Robert Haas
> EnterpriseDB: http://www.enterprisedb.com
> The Enterprise Postgres Company
>


Re: Server crash during simple c-language function

От
Robert Haas
Дата:
2010/9/16 Tomáš Kovářík <kovarik.tomas@gmail.com>:
> Thanks Robert for the test on MacOS X. I wanted to be sure that it is
> not only my installation issue, so I tried the same on Windows Server
> 2003 with PostgreSQL 8.3; the same crash. Is there anybody who has
> written a C-function on Windows platform?

Maybe you should look at some of the examples in contrib, and then
modify them...

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise Postgres Company