Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ltOWU-0005yb-R1 for pgsql-hackers@arkaria.postgresql.org; Wed, 16 Jun 2021 05:55:35 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1ltOWT-0005Iy-Lb for pgsql-hackers@arkaria.postgresql.org; Wed, 16 Jun 2021 05:55:33 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ltOWT-0005Iq-A7 for pgsql-hackers@lists.postgresql.org; Wed, 16 Jun 2021 05:55:33 +0000 Received: from mail-io1-xd2a.google.com ([2607:f8b0:4864:20::d2a]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1ltOWN-0002fJ-25 for pgsql-hackers@postgresql.org; Wed, 16 Jun 2021 05:55:32 +0000 Received: by mail-io1-xd2a.google.com with SMTP id b14so1742441iow.13 for ; Tue, 15 Jun 2021 22:55:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=8oMMQJmNAiCyIdPFNICrluwQbXh7YRBrMLUCX3vr4Mk=; b=TVftkeadx8thd3eWB24piLOcSUYGHV40OyTVwy5e5fZKLWz1oIjbCbXe6mk8oKTnNI nArWRDBvleerna1fpbfX+S7rxFcwJftYnlElApapjoAFemw86/j4l8WnisA/TpPjHLqA FzDFqoT5uWRAGaz+yOZlcHYM19sGlYJwkf6Fih+te1cab73ht9ihU0Wrfeekp84MUoUm 6YXMFbh3y62Ds/UwNyEe2p/JifHKWMktNd/G9zeL5hAvzP9nBLvxHj3vaqcCPk4Cq7PE 9vqSXKYS1/NfKArNJpz7zX9ICxehCloHPEWNb40ckna0sSkUi6mOMXtJV1X0aA9Gth14 C/yw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=8oMMQJmNAiCyIdPFNICrluwQbXh7YRBrMLUCX3vr4Mk=; b=PBUPzN6sGrkJ+jLS2bOaWCjuXIgYRA8SIVTSxevszJv2/TOREOk8aLnr4SAtUI0TpS eTjSSc2usolhB9NMQXBq/Ckq/rCAvtuMjSgr12QqswpQYgy2L5rr63fGlFAen4HiaCJL EER5LTnu+I/G0Xt1mJZcoT/A7gAjd33dbEbycH7l9uIPKV+/Ov/mBCK66ujK24FdIVVt In5CMSI0mIFsW37fyhWPDxdnBrCZIVRm0jKwT5bqIccb/kN/ScCtIn5DLl3psNHYTbhR PKd46AmpVAFdQndxsEnLhkB1PzRrxU5ApYZPwp17v89MJS8m4iQkTo0yeG6vQKEvrmOQ z2Lw== X-Gm-Message-State: AOAM532QGc9rvczMPiF72sAKicKLhWm/i3J3csINrNn3h+FPIAZPLfK2 BaT424g+y4+g5mxAMd4QzwQxzXqu9Pireait32M= X-Google-Smtp-Source: ABdhPJz9sR78roY/UWV4g4WjnAGHsSUZja+BBLsX4L9hgbulM9LQjL2MPH688vDtQ9ZHYzWocgZeEX3Sg3hlSP2L0mg= X-Received: by 2002:a02:9692:: with SMTP id w18mr2647755jai.65.1623822924961; Tue, 15 Jun 2021 22:55:24 -0700 (PDT) MIME-Version: 1.0 References: <0F9ECBA9-1DF2-4C38-BB58-B17EEE6C7B3A@yesql.se> <20210311185847.zwb2rf3n4wzelkba@alap3.anarazel.de> In-Reply-To: From: Thomas Munro Date: Wed, 16 Jun 2021 17:54:48 +1200 Message-ID: Subject: Re: A qsort template To: Zhihong Yu Cc: Andres Freund , Daniel Gustafsson , pgsql-hackers Content-Type: multipart/mixed; boundary="0000000000009ef47405c4dbbca4" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000009ef47405c4dbbca4 Content-Type: text/plain; charset="UTF-8" On Mon, Mar 15, 2021 at 1:09 PM Thomas Munro wrote: > On Sun, Mar 14, 2021 at 5:03 PM Zhihong Yu wrote: > > + * Remove duplicates from an array. Return the new size. > > + */ > > +ST_SCOPE size_t > > +ST_UNIQUE(ST_ELEMENT_TYPE *array, > > > > The array is supposed to be sorted, right ? > > The comment should mention this. > > Good point, will update. Thanks! Rebased. Also fixed some formatting problems and updated typedefs.list so they don't come back. --0000000000009ef47405c4dbbca4 Content-Type: application/x-compressed-tar; name="more-sort-search-specializations-v2.tgz" Content-Disposition: attachment; filename="more-sort-search-specializations-v2.tgz" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kpz261yj0 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 --0000000000009ef47405c4dbbca4--