Andres,

I have just pushed the v10 patch. Yugo will reply back to your point
but I will look into your review as well.

Thanks.

Best regards,
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese:http://www.sraoss.co.jp

> Hi,
> 
> On 2018-03-28 20:26:48 +0900, Yugo Nagata wrote:
>> diff --git a/doc/src/sgml/ref/lock.sgml b/doc/src/sgml/ref/lock.sgml
>> index b2c7203..96d477c 100644
>> --- a/doc/src/sgml/ref/lock.sgml
>> +++ b/doc/src/sgml/ref/lock.sgml
>> @@ -46,6 +46,11 @@ LOCK [ TABLE ] [ ONLY ] <replaceable 
>> class="parameter">name</replaceable> [ * ]
>>    </para>
>>  
>>    <para>
>> +   When a view is specified to be locked, all relations appearing in the 
>> view
>> +   definition query are also locked recursively with the same lock mode. 
>> +  </para>
> 
> Trailing space added. I'd remove "specified to be" from the sentence.
> 
> I think mentioning how this interacts with permissions would be a good
> idea too. Given how operations use the view's owner to recurse, that's
> not obvious. Should also explain what permissions are required to do the
> operation on the view.
> 
> 
>> @@ -86,15 +92,17 @@ RangeVarCallbackForLockTable(const RangeVar *rv, Oid 
>> relid, Oid oldrelid,
>>              return;                                 /* woops, concurrently 
>> dropped; no permissions
>>                                                               * check */
>>  
>> -    /* Currently, we only allow plain tables to be locked */
>> -    if (relkind != RELKIND_RELATION && relkind != RELKIND_PARTITIONED_TABLE)
>> +
> 
> This newline looks spurious to me.
> 
> 
>>  /*
>> + * Apply LOCK TABLE recursively over a view
>> + *
>> + * All tables and views appearing in the view definition query are locked
>> + * recursively with the same lock mode.
>> + */
>> +
>> +typedef struct
>> +{
>> +    Oid root_reloid;
>> +    LOCKMODE lockmode;
>> +    bool nowait;
>> +    Oid viewowner;
>> +    Oid viewoid;
>> +} LockViewRecurse_context;
> 
> Probably wouldn't hurt to pgindent the larger changes in the patch.
> 
> 
>> +static bool
>> +LockViewRecurse_walker(Node *node, LockViewRecurse_context *context)
>> +{
>> +    if (node == NULL)
>> +            return false;
>> +
>> +    if (IsA(node, Query))
>> +    {
>> +            Query           *query = (Query *) node;
>> +            ListCell        *rtable;
>> +
>> +            foreach(rtable, query->rtable)
>> +            {
>> +                    RangeTblEntry   *rte = lfirst(rtable);
>> +                    AclResult                aclresult;
>> +
>> +                    Oid relid = rte->relid;
>> +                    char relkind = rte->relkind;
>> +                    char *relname = get_rel_name(relid);
>> +
>> +                    /* The OLD and NEW placeholder entries in the view's 
>> rtable are skipped. */
>> +                    if (relid == context->viewoid &&
>> +                            (!strcmp(rte->eref->aliasname, "old") || 
>> !strcmp(rte->eref->aliasname, "new")))
>> +                            continue;
>> +
>> +                    /* Currently, we only allow plain tables or views to be 
>> locked. */
>> +                    if (relkind != RELKIND_RELATION && relkind != 
>> RELKIND_PARTITIONED_TABLE &&
>> +                            relkind != RELKIND_VIEW)
>> +                            continue;
>> +
>> +                    /* Check infinite recursion in the view definition. */
>> +                    if (relid == context->root_reloid)
>> +                            ereport(ERROR,
>> +                                            
>> (errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
>> +                                            errmsg("infinite recursion 
>> detected in rules for relation \"%s\"",
>> +                                                            
>> get_rel_name(context->root_reloid))));
> 
> Hm, how can that happen? And if it can happen, why can it only happen
> with the root relation?
> 
> Greetings,
> 
> Andres Freund

Reply via email to