outer join fails with error - solaris only
The following query gives an error when run on solaris 2.7, but it works
fine with an equivalent configuration on rh 6.2.
select tr.transition_key,
tr.transition_name
from wf_transition_info tr
left outer join
wf_context_assignments ca
on (tr.context_key = ca.context_key and
tr.transition_key = ca.transition_key)
where tr.workflow_key = 'expenses_wf'
and tr.context_key = 'default'
and tr.trigger_type = 'user'
and tr.assignment_callback is null;
.
.
.
DROP
CREATE
psql:tst.sql:210: ERROR: RIGHT JOIN is only supported with mergejoinable join conditions
acspg=# select version();
version
-----------------------------------------------------------------
PostgreSQL 7.1 on sparc-sun-solaris2.7, compiled by GCC 2.7.2.2
(1 row)
acspg=#
The following code can be used to reproduce the error:
drop table wf_workflows;
create table wf_workflows (
workflow_key varchar(100)
constraint wf_workflows_pk
primary key,
description text
);
drop table wf_contexts;
create table wf_contexts (
context_key varchar(100)
constraint wf_context_pk
primary key,
context_name varchar(100)
constraint wf_contexts_context_name_nn
not null
constraint wf_contexts_context_name_un
unique
);
drop table wf_transitions;
create table wf_transitions (
transition_key varchar(100),
transition_name varchar(100)
constraint wf_transition_name_nn
not null,
workflow_key varchar(100)
constraint wf_transition_workflow_fk
references wf_workflows(workflow_key)
on delete cascade,
-- purely for UI purposes
sort_order integer
constraint wf_transition_order_ck
check (sort_order > 0),
trigger_type varchar(40)
constraint wf_transition_trigger_type_ck
check (trigger_type in
('','automatic','user','message','time')),
constraint wf_transition_pk
primary key (workflow_key, transition_key),
constraint wf_trans_wf_key_trans_name_un
unique (workflow_key, transition_name)
);
drop table wf_context_transition_info;
create table wf_context_transition_info (
context_key varchar(100)
constraint wf_context_trans_context_fk
references wf_contexts,
workflow_key varchar(100)
constraint wf_context_trans_workflow_fk
references wf_workflows,
transition_key varchar(100),
/* information for the transition in the context */
/* The integer of minutes this task is estimated to take */
estimated_minutes integer,
/*
* Will be called when the transition is enabled/fired.
* signature: (case_id in integer, transition_key in varchar, custom_arg in varchar2)
*/
enable_callback varchar(100),
enable_custom_arg text,
fire_callback varchar(100),
fire_custom_arg text,
/*
* Must insert rows into the wf_task_assignments table.
* Will be called when the transition becomes enabled
* signature: (task_id in integer, custom_arg in varchar)
*/
assignment_callback varchar(100),
assignment_custom_arg text,
/*
* Must return the date that the timed transition should fire
* Will be called when the transition is enabled
* signature: (case_id in integer, transition_key in varchar, custom_arg in varchar2) return date
*/
time_callback varchar(100),
time_custom_arg text,
/*
* Returns the deadline for this task.
* Will be called when the transition becomes enabled
* Signature: (case_id in integer, transition_key in varchar, custom_arg in varchar2) return date
*/
deadline_callback varchar(100),
deadline_custom_arg text,
/* The name of an attribute that holds the deadline */
deadline_attribute_name varchar(100),
/*
* Must return the date that the user's hold on the task times out.
* called when the user starts the task.
* signature: (case_id in integer, transition_key in varchar, custom_arg in varchar2) return date
*/
hold_timeout_callback varchar(100),
hold_timeout_custom_arg text,
/*
* Notification callback
* Will be called when a notification is sent i.e., when a transition is enabled,
* or assignment changes.
* signature: (task_id in integer,
* custom_arg in varchar,
* party_to in integer,
* party_from in out integer,
* subject in out varchar,
* body in out varchar)
*/
notification_callback varchar(100),
notification_custom_arg text,
/*
* Unassigned callback
* Will be called whenever a task becomes unassigned
* Signature: (case_id in integer, transition_key in varchar, custom_arg in varchar2)
*/
unassigned_callback varchar(100),
unassigned_custom_arg text,
/* name of the privilege we should check before allowing access
* to task information.
*/
access_privilege text,
/* table constraints */
constraint wf_context_trans_trans_fk
foreign key (workflow_key, transition_key) references wf_transitions(workflow_key, transition_key)
on delete cascade,
constraint wf_context_transition_pk
primary key (context_key, workflow_key, transition_key)
);
drop table wf_context_assignments;
create table wf_context_assignments (
context_key varchar(100)
constraint wf_context_assign_context_fk
references wf_contexts(context_key)
on delete cascade,
workflow_key varchar(100)
constraint wf_context_assign_workflow_fk
references wf_workflows(workflow_key)
on delete cascade,
transition_key varchar(100),
party_id integer,
/* table constraints */
constraint wf_context_assign_trans_fk
foreign key (workflow_key, transition_key) references wf_transitions(workflow_key, transition_key)
on delete cascade,
constraint wf_context_assign_pk
primary key (context_key, workflow_key, transition_key, party_id)
);
drop view wf_transition_contexts;
create view wf_transition_contexts as
select t.transition_key,
t.transition_name,
t.workflow_key,
t.sort_order,
t.trigger_type,
c.context_key,
c.context_name
from wf_transitions t, wf_contexts c;
drop view wf_transition_info;
create view wf_transition_info as
select t.transition_key,
t.transition_name,
t.workflow_key,
t.sort_order,
t.trigger_type,
t.context_key,
ct.estimated_minutes,
ct.enable_callback,
ct.enable_custom_arg,
ct.fire_callback,
ct.fire_custom_arg,
ct.assignment_callback,
ct.assignment_custom_arg,
ct.time_callback,
ct.time_custom_arg,
ct.deadline_callback,
ct.deadline_custom_arg,
ct.deadline_attribute_name,
ct.hold_timeout_callback,
ct.hold_timeout_custom_arg,
ct.notification_callback,
ct.notification_custom_arg,
ct.unassigned_callback,
ct.unassigned_custom_arg,
ct.access_privilege
from wf_transition_contexts t LEFT OUTER JOIN wf_context_transition_info ct
on (ct.workflow_key = t.workflow_key and
ct.transition_key = t.transition_key and
ct.context_key = t.context_key);
Regards,
Dan Wickstrom
danw@rtp.ericsson.se writes:
The following query gives an error when run on solaris 2.7, but it works
fine with an equivalent configuration on rh 6.2.
It probably has nothing to do with the platform, but rather with when
you last ran VACUUM ANALYZE and what the exact contents of the database
were at the time. Does the problem become reproducible on both
platforms if you do
SET enable_hashjoin TO off;
SET enable_nestloop TO off;
ERROR: RIGHT JOIN is only supported with mergejoinable join conditions
I believe this is fixed in 7.1.1 --- sounds like the same bug as
2001-04-14 20:48 tgl
* src/backend/optimizer/path/joinpath.c: Prevent generation of
invalid plans for RIGHT or FULL joins with multiple join clauses.
The mergejoin executor wants all the join clauses to appear as
merge quals, not as extra joinquals, for these kinds of joins. But
the planner would consider plans in which partially-sorted input
paths were used, leading to only some of the join clauses becoming
merge quals. This is fine for inner/left joins, not fine for
right/full joins.
regards, tom lane
"Tom" == Tom Lane <tgl@sss.pgh.pa.us> writes:
Tom> danw@rtp.ericsson.se writes:
The following query gives an error when run on solaris 2.7, but
it works fine with an equivalent configuration on rh 6.2.
Tom> It probably has nothing to do with the platform, but rather
Tom> with when you last ran VACUUM ANALYZE and what the exact
Tom> contents of the database were at the time. Does the problem
Tom> become reproducible on both platforms if you do SET
Tom> enable_hashjoin TO off; SET enable_nestloop TO off;
I don't vacuum analyze either of these machines, since I'm doing development
now and the db's only have test data in them.
Doing a vacuum analyze and setting enable_hashjoin, enable_nestloop to
off had no effect on solaris. I'll have to wait until I get home
tonight to try the linux box.
ERROR: RIGHT JOIN is only supported with mergejoinable join
conditions
Tom> I believe this is fixed in 7.1.1 --- sounds like the same bug
Tom> as
I'll try upgrading.
-Dan