Received: from localhost (maia-4.hub.org [200.46.204.183]) by postgresql.org (Postfix) with ESMTP id 6538C9FA12B for ; Fri, 1 Dec 2006 15:30:07 -0400 (AST) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.183]) (amavisd-new, port 10024) with ESMTP id 66911-06 for ; Fri, 1 Dec 2006 15:29:54 -0400 (AST) X-Greylist: delayed 00:18:25.472095 by SQLgrey-1.7.4 Received: from elasmtp-junco.atl.sa.earthlink.net (elasmtp-junco.atl.sa.earthlink.net [209.86.89.63]) by postgresql.org (Postfix) with ESMTP id E220D9F9F0E for ; Fri, 1 Dec 2006 15:29:53 -0400 (AST) Received: from [69.3.100.14] (helo=[192.168.26.5]) by elasmtp-junco.atl.sa.earthlink.net with asmtp (Exim 4.34) id 1GqDn8-0000yz-1G for pgsql-sql@postgresql.org; Fri, 01 Dec 2006 14:11:22 -0500 Message-ID: <45707F56.70402@earthcomber.com> Date: Fri, 01 Dec 2006 13:15:34 -0600 From: Chris Dunworth User-Agent: Thunderbird 1.5.0.8 (X11/20061115) MIME-Version: 1.0 To: pgsql-sql@postgresql.org Subject: Problem inserting composite type values Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-ELNK-Trace: f95dbdb9e0397947e4766830010d2531239a348a220c2609f8215ab92058bb3a012ae31efb223df8666fa475841a1c7a350badd9bab72f9c350badd9bab72f9c X-Originating-IP: 69.3.100.14 X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200612/14 X-Sequence-Number: 26970 Hi all -- (huge apologies if this is a duplicate post -- I sent from an unsubscribed email account before...) I have a problem trying to INSERT INTO a table by selecting from a function that returns a composite type. (I'm running version 8.1.4, FYI) Basically, I have two tables. I want to retrieve rows from one table and store them into the other. The schema of the two tables is not the same, so I use a conversion function (written in plperl) that takes a row from the start table and returns a row from the end table. However, I can't get the insert working. Here's a simplified example of my real system (must have plperl installed to try it): --------------------------------------- -- Read rows from here... CREATE TABLE startTable ( intVal integer, textVal text ); -- ...and store as rows in here CREATE TABLE endTable ( intVal integer, newVal1 integer, newVal2 integer); -- Some test data for the startTable INSERT INTO startTable VALUES ( 1, '10:11'); INSERT INTO startTable VALUES ( 2, '20:25'); INSERT INTO startTable VALUES ( 3, '30:38'); -- Note: Takes composite type as argument, and returns composite type. -- This just converts a row of startTable into a row of endTable, splitting -- the colon-delimited integers from textVal into separate integers. CREATE OR REPLACE FUNCTION convertStartToEnd(startTable) RETURNS endTable AS $$ my ($startTable) = @_; my @newVals = split(/:/, $startTable->{"textval"}); my $result = { "intval"=>$startTable->{"intval"}, "newval1"=>@newVals[0], "newval2"=>@newVals[1] }; return $result; $$ LANGUAGE plperl; --------------------------------------- Now, if I run the following SELECT, I get the results below it: SELECT convertStartToEnd(st.*) FROM startTable st; convertstarttoend ------------------- (1,10,11) (2,20,25) (3,30,38) (3 rows) This seems OK. But when I try to INSERT the results of this select into the endTable, I get this error: INSERT INTO endTable SELECT convertStartToEnd(st.*) FROM startTable st; ERROR: column "intval" is of type integer but expression is of type endtable HINT: You will need to rewrite or cast the expression It's taking the entire row coming out of the function (e.g. "(3,30,38)") and tries to fit it all into just the first column, intVal. I'm obviously doing something wrong. Is there some way to format the INSERT so that I can get full rows inserted, with the individual columns separated out properly (e.g. intVal=3, newVal1=30, newVal2=38)? I'm still pretty new to all this, so it could be something simple. Thanks for reading. Kind Regards, Chris Dunworth