#601: ProgrammingError: column "product" specified more than onceLINE 1:
...tus,product,severity,keywords,cc,time,changetime, product) V...
^
---------------------------+--------------------
  Reporter:  ogaerick      |      Owner:  nobody
      Type:  defect        |     Status:  new
  Priority:  blocker       |  Milestone:
 Component:  multiproduct  |    Version:  0.6.0
Resolution:                |   Keywords:
---------------------------+--------------------

Comment (by olemis):

 Below I explain the reason why I'm still getting the same error this side
 .

 Replying to [comment:5 rjollos]:
 > When I create a ticket using the quick ticket form, the following SQL is
 executed (`[trac] debug_sql = true`):
 > {{{
 > 04:32:59 AM Trac[dbcursor] DEBUG: SQL: INSERT INTO ticket
 
(summary,reporter,owner,description,type,status,priority,product,milestone,component,version,resolution,time,changetime,
 product) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,'prod1')
 > 04:32:59 AM Trac[util] DEBUG: SQL: INSERT INTO ticket
 
(summary,reporter,owner,description,type,status,priority,product,milestone,component,version,resolution,time,changetime,
 product) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,'prod1')
 > }}}
 >
 > The duplication of the `product` field, caused by the addition of the
 `product` select in #569, doesn't seem to cause a problem with SQLite, but
 I'll attempt to reproduce with PostgreSQL.
 >
 > I'm not seeing a duplication of the `product` field for tickets created
 from the `/newticket` URL (i.e. the full new ticket form):
 > {{{
 > 03:46:38 AM Trac[dbcursor] DEBUG: Original SQl: INSERT INTO ticket
 (summary,reporter,owner,descriobserving this
 
issueption,type,status,priority,milestone,component,version,keywords,cc,time,changetime)
 VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
 > 03:46:38 AM Trac[dbcursor] DEBUG: SQL: INSERT INTO ticket
 
(summary,reporter,owner,description,type,status,priority,milestone,component,version,keywords,cc,time,changetime,
 product) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,'@')
 > }}}
 >

 Unfortunately `INSERT` statements are not logged in my instance . I can
 only see lines for `SELECT` statements . I'd appreciate if you share any
 ideas .

 > The latter finding isn't too surprising since there shouldn't be a
 product select field within the `#inplace-propertyform` form. The product
 select should only exist on the breadcrumb. Do you see a product select
 field in the new ticket form when on the `/newticket` page?

 As far as I can tell it always inserts product field twice my side . I
 reproduced the sequence of invocations leading to the error in
 `trac.ticket.model.Ticket` and this is what I get

 {{{#!py

 >>> from trac.env import open_environment as oe
 >>> genv = oe('/path/to/blood-hound.net')
 >>> from multiproduct.env import ProductEnvironment as PE
 >>> penv = PE(genv, 'dataviz')
 >>> from multiproduct.dbcursor import translate_sql

 # Headless test mode ;)

 >>> sql = translate_sql(penv, "INSERT INTO ticket (summary, product)
 VALUES ('S', 'swlcu')")
 >>> sql
 u"INSERT INTO ticket (summary, product, product) VALUES ('S',
 'swlcu','dataviz')"

 >>> from trac.ticket.model import Ticket
 >>> t = Ticket(penv)
 >>> self = t

 # Copy and paste lines 226-235 in trac/ticket/model.py

 >>> if True:
 ...         std_fields = []
 ...         custom_fields = []
 ...         for f in self.fields:
 ...             fname = f['name']
 ...             if fname in self.values:
 ...                 if f.get('custom'):
 ...                     custom_fields.append(fname)
 ...                 else:
 ...                     std_fields.append(fname)
 ...

 # The query in lines 238-241

 >>> orig = ("INSERT INTO ticket (%s) VALUES (%s)"
 ...                            % (','.join(std_fields),
 ...                               ','.join(['%s'] * len(std_fields))))
 >>> orig
 'INSERT INTO ticket (owner,type,priority,product,version) VALUES
 (%s,%s,%s,%s,%s)'
 >>> sql = translate_sql(penv, orig)
 >>> sql
 u"INSERT INTO ticket (owner,type,priority,product,version, product) VALUES
 (%s,%s,%s,%s,%s,'dataviz')"
 }}}

 `product` appears twice because

   1. it is included in `std_fields` via ITicketFieldsProvider
   2. and appended once again after translation

 All this happens using PostgreSQL backend .

-- 
Ticket URL: <https://issues.apache.org/bloodhound/ticket/601#comment:9>
Apache Bloodhound <https://issues.apache.org/bloodhound/>
The Apache Bloodhound issue tracker

Reply via email to