[英]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.