Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1VgbG4-0000uW-8b for pgsql-sql@arkaria.postgresql.org; Wed, 13 Nov 2013 14:17:28 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.80) (envelope-from ) id 1VgbG3-00067e-NY for pgsql-sql@arkaria.postgresql.org; Wed, 13 Nov 2013 14:17:27 +0000 Received: from makus.postgresql.org ([2001:4800:7903:4::125]) by malur.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1VgbG2-00065w-1t for pgsql-sql@postgresql.org; Wed, 13 Nov 2013 14:17:26 +0000 Received: from teak.britvault.co.uk ([78.33.153.148]) by makus.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1VgbFv-0006zZ-SA for pgsql-sql@postgresql.org; Wed, 13 Nov 2013 14:17:25 +0000 Received: by teak.britvault.co.uk (Postfix, from userid 1970) id 3dKSZR01FTzBBW; Wed, 13 Nov 2013 14:17:18 +0000 (GMT) Date: Wed, 13 Nov 2013 14:17:18 +0000 To: pgsql-sql@postgresql.org Subject: Re: Function args: TEXT -vs- VARCHAR? Message-ID: <20131113141718.GA29223@teak.britvault.co.uk> References: <20131112181744.GA7522@teak.britvault.co.uk> <20131113130308.GA17439@teak.britvault.co.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20131113130308.GA17439@teak.britvault.co.uk> User-Agent: Mutt/1.5.21 (2010-09-15) From: skinner@britvault.co.uk (Craig R. Skinner) X-Pg-Spam-Score: -1.9 (-) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-sql Precedence: bulk Sender: pgsql-sql-owner@postgresql.org On 2013-11-13 Wed 13:03 PM |, Craig R. Skinner wrote: > > Yes, I'll change the function args to be the same as the table columns > so the functions fail on over length input, rather than going through > the process of validating customer id & account, only to fail on data. > > Therefore => performace increase with character varying function args. > Well, I got a SURPRISE there as it seems PostgreSQL function arguments loose their precision. Character varying(n) args become character varying / text. I would have thought that this function should fail when called, not at the INSERT phase: --======= CREATE TABLE rubbish ( junk character varying(12) NOT NULL ); --======= CREATE OR REPLACE FUNCTION load_rubbish(gash character varying(12)) RETURNS boolean AS $BODY$ BEGIN INSERT INTO rubbish ( junk ) VALUES ( gash ); RETURN FOUND; END; $BODY$ LANGUAGE plpgsql; --======= SELECT * FROM load_rubbish('Waaaay toooo loooong!'); --======= ********** Error ********** ERROR: value too long for type character varying(12) SQL state: 22001 Context: SQL statement "INSERT INTO rubbish ( junk ) VALUES ( gash )" PL/pgSQL function load_rubbish(character varying) line 4 at SQL statement ^^^ The length limit has gone. This page does not say the precision is stripped: "... Functions written in PL/pgSQL can accept as arguments any scalar or array data type supported by the server, ...." http://www.postgresql.org/docs/9.2/static/plpgsql-overview.html#PLPGSQL-ARGS-RESULTS Neither does this page: argtype ".... The argument types can be base, ...." http://www.postgresql.org/docs/current/static/sql-createfunction.html Comments? -- Craig Skinner | http://twitter.com/Craig_Skinner | http://linkd.in/yGqkv7 -- Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-sql