I am getting below error while calling Postgresql function with argument containing dot (.) operator.

SQL Error [42P01]: ERROR: relation "es.article_data" does not exist Where: PL/pgSQL function es.getrowcount(text) line 6 at EXECUTE.... 

Query: select es.getrowcount(schemawithtable :='es.article_data');

Function:

CREATE FUNCTION es.getrowcount (schemawithtable text) RETURNS VARCHAR(50) AS $msg$ declare msg VARCHAR(50); total integer; begin execute format('select count(*) from %I where until_ts is null', schemawithtable) into total; msg := CONCAT(total, ' records are there in ',schemawithtable); RETURN msg; END; $msg$ LANGUAGE plpgsql; 

Error traces from DBeaver:

org.jkiss.dbeaver.model.sql.DBSQLException: SQL Error [42P01]: ERROR: relation "es.article_data" does not exist Where: PL/pgSQL function es.getrowcount(text) line 6 at EXECUTE at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:134) at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeStatement(SQLQueryJob.java:487) at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.lambda$0(SQLQueryJob.java:424) at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:164) at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeSingleQuery(SQLQueryJob.java:416) at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.extractData(SQLQueryJob.java:774) at org.jkiss.dbeaver.ui.editors.sql.SQLEditor$QueryResultsContainer.readData(SQLEditor.java:2914) at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:110) at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:164) at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:108) at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$17.run(ResultSetViewer.java:3421) at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:103) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) Caused by: org.postgresql.util.PSQLException: ERROR: relation "es.article_data" does not exist Where: PL/pgSQL function es.getrowcount(text) line 6 at EXECUTE at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308) at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441) at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365) at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:307) at org.postgresql.jdbc.PgStatement.executeCachedSql(PgStatement.java:293) at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:270) at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:266) at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.execute(JDBCStatementImpl.java:338) at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:131) ... 12 more 

I have figure out the workaround by passing schema name separately.

Working Query: select es.getrowcount(schemaname :='es',tablename :='article_data');

CREATE FUNCTION es.getrowcount (schemaname text, tablename text) ... begin execute format('select count(*) from %I.%I where until_ts is null',schemaname, tablename) into total; ... $msg$ LANGUAGE plpgsql; 

Versions: PostgreSQL - 10.12 DBeaver (client) - 6.3.5

But I want to know why it is giving an error for argument containing dot (.) operator ?

1 Answer

When you are creating your query with format and %I. It is creating your query like below

With Single Parameter:

select count(*) from "es.article_data" where until_ts is null 

With Double Parameter:

select count(*) from "es"."article_data" where until_ts is null 

In first case it will show error because you can not use table name with schema like this. But in second case it worked perfectly as this is the right way to use naming convention.

If you want to use the first method only. you should use %s instead of %Ilike below

CREATE FUNCTION es.getrowcount (schemawithtable text) RETURNS VARCHAR(50) AS $msg$ declare msg VARCHAR(50); total integer; begin execute format('select count(*) from %s where until_ts is null', schemawithtable) into total; msg := CONCAT(total, ' records are there in ',tablename); RETURN msg; END; $msg$ LANGUAGE plpgsql; 

NOTE : This will work properly if your table names and schema names are in lower case only

1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.