簡體   English   中英

從9.0升級到9.3后,PostgreSQL處理標識符區分大小寫嗎?

[英]PostgreSQL treating identifier case sensitive after upgrade from 9.0 to 9.3?

我有一個在Postgres 9.0上運行良好的應用程序,但是升級到9.3后,一個巨大的sql語句停止了工作。 我的假設是pg的行為從不區分大小寫更改為區分大小寫。 這是在pg 9.0上有效的語句,但在9.3上引發錯誤:

> ERROR:  column tmplrole.name does not exist at character 35

查詢:

select cftCE.f_resource as ceId, tmplRole.name as tRole, mdtk.meta_type_key as metaKey, md1.metadatum_value as metaValue, grp1.id as groupId 
from account acc1 
left outer join account_role accRole on acc1.f_principal=accRole.f_account  
left outer join roles r1 on accRole.f_role=r1.f_principal 
left outer join template_role tmplRole on r1.f_template_role=tmplRole.id 
left outer join groups grp1 on r1.f_group=grp1.id left outer join content_entry cftCE on grp1.f_content_entry=cftCE.f_resource 
left outer join metadatum md1 on cftCE.f_resource=md1.f_content_entry  
left outer join meta_type mdtk on md1.f_meta_type=mdtk.id  
inner join ( select f_content_entry as permCe from groups grp 
inner join ( select f_group as groupId from operation opr     
inner join ( select ppr.f_resource as cftce from PRINCIPAL_PERMISSION_RESOURCE ppr      
inner join ( select roles.f_principal  as userrole from roles, account_role, account      
where roles.f_principal=account_role.F_role and account_role.f_account=account.f_principal and account.f_principal=$1 )
AS roles_alias on ppr.f_principal = userrole      
inner join (select operation.f_resource  as viewCftOperation from Operation where Operation.F_TEMPLATE_OPERATION=$2 ) 
AS operation_alias on ppr.f_resource = viewCftOperation ) AS ppr_alias on opr.F_resource = cftce )
AS group_alias  on grp.ID = groupid ) 
AS content_entry_alias on cftCE.f_resource = permCe where acc1.f_principal=$3
and (mdtk.meta_type_key=$4 or mdtk.meta_type_key=$5 or mdtk.meta_type_key=$6) order by cftCE.date_created desc;

區分大小寫的規則沒有更改,但是在PostgreSQL 9.1中對tablename.type的處理已更改。 問題是name是postgres內置類型,用於目錄。

這是9.1 發行說明中的相關條目:

E.14.2.2。 鑄件
不允許對復合類型使用函數樣式和屬性樣式的數據類型轉換(Tom Lane)

例如,禁止Composite_value.text和text(composite_value)。 無意中使用此語法經常會導致錯誤報告。 盡管這不是錯誤,但最好還是拒絕此類表達式。 當實際打算轉換整個復合值時,仍可以使用CAST和::語法。

我的猜測是您的表template_role在9.0中沒有name列,並且將tmplRole.name解釋為tmplRole::name是一個錯誤,在您的查詢中tmplRole::name引起注意。

另請參閱相關內容在PostgreSQL中,name是一個特殊的關鍵字嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM