Re: [HACKERS] Issue while calling new PostgreSQL command from a Java Application

2014-07-04 Thread Ashutosh Bapat
You may have to add code to copy inp_str to _copyVacuumStmt(). See how a
character array being copied from other _copy* functions.


On Fri, Jul 4, 2014 at 10:43 AM, Ashoke s.ash...@gmail.com wrote:

 Hi,

 --

 I have defined a new command my_command in PostgreSQL. This command takes
 the path of ANALYZE and inside analyze.c, I have a function to do some
 operations if its my_command.This command takes the input arguments:
 table name, column name and an input string.

 my_command nation (n_nationkey) 'input string';

 When I run this command from command line psql, it works as expected. But
 when I call the same command from a java application, the variable that
 stores the input string is NULL.

 I printed the value of the input string in gram.y file where I have
 defined my_command.
 fprintf (stderr, I am inside gram.y %s\n,n-inp_str); and the input
 string is printed correctly.

 But when I print stmt-inp_str in the function standard_ProcessUtility()
  of utility.c for the case T_VacuumStmt, I get the value as NULL. This is
 as far as I could trace back from analyze.c.

 I am not sure how executing the same command from an application can make
 a difference.

 gram.y content gist:
 --

 MyStmt:
 my_keyword qualified_name name_list my_inp_str
 {
 VacuumStmt *n = makeNode(VacuumStmt);
 n-options = VACOPT_ANALYZE;
 n-freeze_min_age = -1;
 n-freeze_table_age = -1;
 n-relation = $2;
 n-va_cols = $3;
 n-inp_str = $4;
 fprintf (stderr, I am inside gram.y %s\n,n-inp_str);

 $$ = (Node *)n;
 };

 char *inp_str is added to the struct VacuumStmt in parsenodes.h

 ---

 Only the newly added char *inp_str(that is different from ANALYZE) value
 is NULL. I was able to retrieve the column name from va_cols.

 Any help is appreciated. Thanks!
 --
 Regards,
 Ashoke





-- 
Best Wishes,
Ashutosh Bapat
EnterpriseDB Corporation
The Postgres Database Company


Re: [HACKERS] Issue while calling new PostgreSQL command from a Java Application

2014-07-04 Thread Abhijit Menon-Sen
At 2014-07-04 10:43:12 +0530, s.ash...@gmail.com wrote:

 I am not sure how executing the same command from an application can
 make a difference.

It shouldn't make any difference, of course.

But since you're seeing the problem with new code, the overwhelming
probability is that there's an error in the new code. That being the
case, speculating about what might be going wrong without looking at
the code in question is a waste of time.

-- Abhijit


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] Issue while calling new PostgreSQL command from a Java Application

2014-07-04 Thread Ashoke
Thank you Ashutosh*.* That was the issue. But, could you please explain why
it worked from command line?


On Fri, Jul 4, 2014 at 11:49 AM, Ashutosh Bapat 
ashutosh.ba...@enterprisedb.com wrote:

 You may have to add code to copy inp_str to _copyVacuumStmt(). See how a
 character array being copied from other _copy* functions.


 On Fri, Jul 4, 2014 at 10:43 AM, Ashoke s.ash...@gmail.com wrote:

 Hi,

 --

 I have defined a new command my_command in PostgreSQL. This command
 takes the path of ANALYZE and inside analyze.c, I have a function to do
 some operations if its my_command.This command takes the input
 arguments: table name, column name and an input string.

 my_command nation (n_nationkey) 'input string';

 When I run this command from command line psql, it works as expected.
 But when I call the same command from a java application, the variable that
 stores the input string is NULL.

 I printed the value of the input string in gram.y file where I have
 defined my_command.
 fprintf (stderr, I am inside gram.y %s\n,n-inp_str); and the input
 string is printed correctly.

 But when I print stmt-inp_str in the function standard_ProcessUtility()
  of utility.c for the case T_VacuumStmt, I get the value as NULL. This
 is as far as I could trace back from analyze.c.

 I am not sure how executing the same command from an application can make
 a difference.

 gram.y content gist:
 --

 MyStmt:
 my_keyword qualified_name name_list my_inp_str
 {
 VacuumStmt *n = makeNode(VacuumStmt);
 n-options = VACOPT_ANALYZE;
 n-freeze_min_age = -1;
 n-freeze_table_age = -1;
 n-relation = $2;
 n-va_cols = $3;
 n-inp_str = $4;
 fprintf (stderr, I am inside gram.y %s\n,n-inp_str);

 $$ = (Node *)n;
 };

 char *inp_str is added to the struct VacuumStmt in parsenodes.h

 ---

 Only the newly added char *inp_str(that is different from ANALYZE) value
 is NULL. I was able to retrieve the column name from va_cols.

 Any help is appreciated. Thanks!
 --
 Regards,
 Ashoke





 --
 Best Wishes,
 Ashutosh Bapat
 EnterpriseDB Corporation
 The Postgres Database Company




-- 
Regards,
Ashoke


Re: [HACKERS] Issue while calling new PostgreSQL command from a Java Application

2014-07-04 Thread Ashutosh Bapat
On Fri, Jul 4, 2014 at 12:30 PM, Ashoke s.ash...@gmail.com wrote:

 Thank you Ashutosh*.* That was the issue. But, could you please explain
 why it worked from command line?


I do not know. Any time we add a member to a node and find it's value
coming out NULL or 0 instead of the one set, corresponding _copy* is the
first suspect. You may be able find why it worked in command line and why
not through the connector by breaking on copyObject() in either cases.



 On Fri, Jul 4, 2014 at 11:49 AM, Ashutosh Bapat 
 ashutosh.ba...@enterprisedb.com wrote:

 You may have to add code to copy inp_str to _copyVacuumStmt(). See how a
 character array being copied from other _copy* functions.


 On Fri, Jul 4, 2014 at 10:43 AM, Ashoke s.ash...@gmail.com wrote:

 Hi,

 --

 I have defined a new command my_command in PostgreSQL. This command
 takes the path of ANALYZE and inside analyze.c, I have a function to do
 some operations if its my_command.This command takes the input
 arguments: table name, column name and an input string.

 my_command nation (n_nationkey) 'input string';

 When I run this command from command line psql, it works as expected.
 But when I call the same command from a java application, the variable that
 stores the input string is NULL.

 I printed the value of the input string in gram.y file where I have
 defined my_command.
 fprintf (stderr, I am inside gram.y %s\n,n-inp_str); and the input
 string is printed correctly.

 But when I print stmt-inp_str in the function standard_ProcessUtility()
  of utility.c for the case T_VacuumStmt, I get the value as NULL. This
 is as far as I could trace back from analyze.c.

 I am not sure how executing the same command from an application can
 make a difference.

 gram.y content gist:
 --

 MyStmt:
 my_keyword qualified_name name_list my_inp_str
 {
 VacuumStmt *n = makeNode(VacuumStmt);
 n-options = VACOPT_ANALYZE;
 n-freeze_min_age = -1;
 n-freeze_table_age = -1;
 n-relation = $2;
 n-va_cols = $3;
 n-inp_str = $4;
 fprintf (stderr, I am inside gram.y %s\n,n-inp_str);

 $$ = (Node *)n;
 };

 char *inp_str is added to the struct VacuumStmt in parsenodes.h

 ---

 Only the newly added char *inp_str(that is different from ANALYZE)
 value is NULL. I was able to retrieve the column name from va_cols.

 Any help is appreciated. Thanks!
 --
 Regards,
 Ashoke





 --
 Best Wishes,
 Ashutosh Bapat
 EnterpriseDB Corporation
 The Postgres Database Company




 --
 Regards,
 Ashoke







-- 
Best Wishes,
Ashutosh Bapat
EnterpriseDB Corporation
The Postgres Database Company


Re: [HACKERS] Issue while calling new PostgreSQL command from a Java Application

2014-07-04 Thread Tom Lane
Ashoke s.ash...@gmail.com writes:
 Thank you Ashutosh*.* That was the issue. But, could you please explain why
 it worked from command line?

Simple vs extended query protocol, probably --- the former avoids copying
the constructed parsetree, but I think the latter doesn't.  Or maybe the
JDBC driver tried to prepare the query; a prepared statement is most
certainly going to copy the parsetree.

In general, if you add a field to any node type, you'd better go through
backend/nodes/ and teach all the relevant functions about it.  What I tend
to do is grep for one of the existing fields in the struct and see which
functions that reference it need additions.

regards, tom lane


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


[HACKERS] Issue while calling new PostgreSQL command from a Java Application

2014-07-03 Thread Ashoke
Hi,

--

I have defined a new command my_command in PostgreSQL. This command takes
the path of ANALYZE and inside analyze.c, I have a function to do some
operations if its my_command.This command takes the input arguments: table
name, column name and an input string.

my_command nation (n_nationkey) 'input string';

When I run this command from command line psql, it works as expected. But
when I call the same command from a java application, the variable that
stores the input string is NULL.

I printed the value of the input string in gram.y file where I have defined
my_command.
fprintf (stderr, I am inside gram.y %s\n,n-inp_str); and the input
string is printed correctly.

But when I print stmt-inp_str in the function standard_ProcessUtility() of
utility.c for the case T_VacuumStmt, I get the value as NULL. This is as
far as I could trace back from analyze.c.

I am not sure how executing the same command from an application can make a
difference.

gram.y content gist:
--

MyStmt:
my_keyword qualified_name name_list my_inp_str
{
VacuumStmt *n = makeNode(VacuumStmt);
n-options = VACOPT_ANALYZE;
n-freeze_min_age = -1;
n-freeze_table_age = -1;
n-relation = $2;
n-va_cols = $3;
n-inp_str = $4;
fprintf (stderr, I am inside gram.y %s\n,n-inp_str);

$$ = (Node *)n;
};

char *inp_str is added to the struct VacuumStmt in parsenodes.h

---

Only the newly added char *inp_str(that is different from ANALYZE) value is
NULL. I was able to retrieve the column name from va_cols.

Any help is appreciated. Thanks!
-- 
Regards,
Ashoke