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 1mLW41-0004Zu-FA for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Sep 2021 19:38:25 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1mLW3z-0007B8-KO for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Sep 2021 19:38:23 +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 1mLW3z-00079v-7g for pgsql-hackers@lists.postgresql.org; Wed, 01 Sep 2021 19:38:23 +0000 Received: from mail-il1-x12f.google.com ([2607:f8b0:4864:20::12f]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1mLW3w-0004qH-Ht for pgsql-hackers@postgresql.org; Wed, 01 Sep 2021 19:38:22 +0000 Received: by mail-il1-x12f.google.com with SMTP id v16so407153ilo.10 for ; Wed, 01 Sep 2021 12:38:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=telsasoft-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=dHGs0up8AIoKyPr7d+g7bXMoTWI/FigSlElxMQ+z3Ys=; b=FEmzDEXAsJyTnaqW9L8nhlwPdUF0xqCN4HcGax3c353EB4Aaodt+LJON7GhxZtW1y6 kFw4fuTMjW34HMFOKA1k+tqR1KJlUo9aOoTzDCQVhhYNQuaKGfWv8rr5ntYaLZm3zLQ2 CwY1Ma0CrX8EFu7OybaYiQlSLzmwGiFYKr7k6rkbEU2NHNG6ZCoilhJhWYXZHwut97Rn t+Pvaez3vlJBLg4reh4nrlZvZYmpyF1YBPZUSFb3XAjQs9Wi0GzixCz5Fm4vMBuLnS92 HEtjLfEiNiwbjuDGLABQDvkIAjOOA8ZcO8cweG0dsuU2Uj6mrHSzXOMzqx9F8H9whdjX ZAKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=dHGs0up8AIoKyPr7d+g7bXMoTWI/FigSlElxMQ+z3Ys=; b=ZCKhAdaE4ZqAbzaY17wuJvv6JGz41gpYyZEdGnau+P7uZzNYSbAm4POWzlzbJkuqyB xLMZkFxggxFsIsmC9dKcqYM8XVLlNtfUnz5WECYDjafI0PdHH9LM2xigRndKnjtA7hFw /PgBRJiTedV+DXh4/2A+ucnO2ipDFn/zyFxTQ1QVJNzAAkTkP+B4d4P/jQlTE2bPTnqM Mi4rqeIaDXHvVS4g2oQtibYa80xCwZtSGX5fAg6hTwekxsxLhdp9wqhSXSaB/b43Yukg 8sUN+FgNyz4uoK54DUoNsY1/tIqeT82ihiANU7eI5er0+RfGQEILnFnplspGxGp8btRE BZHg== X-Gm-Message-State: AOAM5305teRvRLe3ZBkBTbHcm99o3WRes5ScPAcyIpnJ+2dMDsSFS9Vt bVPhfmTe9b+bA8K4pP2fBiZi+Q== X-Google-Smtp-Source: ABdhPJxw9NgaqHJScjs/SYQ2Ac7WyYpvhXofVZTwJ9haPQF/COjIB3EqQVMoa3oOVsbfgIS0Eht4Rg== X-Received: by 2002:a92:c64c:: with SMTP id 12mr773845ill.235.1630525097932; Wed, 01 Sep 2021 12:38:17 -0700 (PDT) Received: from pryzbyj.telsasoft (charmander.telsasoft.com. [50.244.222.1]) by smtp.gmail.com with ESMTPSA id m10sm259677ilg.20.2021.09.01.12.38.17 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 01 Sep 2021 12:38:17 -0700 (PDT) Received: by pryzbyj.telsasoft (Postfix, from userid 1000) id 6E03F800BDE; Wed, 1 Sep 2021 14:38:16 -0500 (CDT) Date: Wed, 1 Sep 2021 14:38:16 -0500 From: Justin Pryzby To: Tomas Vondra Cc: Dean Rasheed , hackers Subject: Re: PoC/WIP: Extended statistics on expressions Message-ID: <20210901193816.GO26465@telsasoft.com> References: <20201123022604.GD24052@telsasoft.com> <6455e0ad-2a2e-bdb0-e1f8-fd4983d1c8aa@enterprisedb.com> <087086de-1384-8374-4efc-2e7915071d5c@enterprisedb.com> <20210816013255.GS10479@telsasoft.com> <20210824131320.GO10479@telsasoft.com> <6bc0ab0c-a807-2b7f-7df8-ac90c7839013@enterprisedb.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <6bc0ab0c-a807-2b7f-7df8-ac90c7839013@enterprisedb.com> User-Agent: Mutt/1.9.4 (2018-02-28) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On Wed, Sep 01, 2021 at 06:45:29PM +0200, Tomas Vondra wrote: > > > Patch 0001 fixes the "double parens" issue discussed elsewhere in this > > > thread, and patch 0002 tweaks CREATE STATISTICS to treat "(a)" as a simple > > > column reference. > > > > 0002 refuses to create expressional stats on a simple column reference like > > (a), which I think is helps to avoid a user accidentally creating useless ext > > stats objects (which are redundant with the table's column stats). > > > > 0002 does not attempt to refuse cases like (a+0), which I think is fine: > > we don't try to reject useless cases if someone insists on it. > > See 240971675, 701fd0bbc. > > > > So I am +1 to apply both patches. > > > > I added this as an Opened Item for increased visibility. > > I've pushed both fixes, so the open item should be resolved. Thank you - I marked it as such. There are some typos in 537ca68db (refenrece) I'll add them to my typos branch if you don't want to patch them right now or wait to see if someone notices anything else. diff --git a/src/backend/commands/statscmds.c b/src/backend/commands/statscmds.c index 59369f8736..17cbd97808 100644 --- a/src/backend/commands/statscmds.c +++ b/src/backend/commands/statscmds.c @@ -205,27 +205,27 @@ CreateStatistics(CreateStatsStmt *stmt) numcols = list_length(stmt->exprs); if (numcols > STATS_MAX_DIMENSIONS) ereport(ERROR, (errcode(ERRCODE_TOO_MANY_COLUMNS), errmsg("cannot have more than %d columns in statistics", STATS_MAX_DIMENSIONS))); /* * Convert the expression list to a simple array of attnums, but also keep * a list of more complex expressions. While at it, enforce some * constraints - we don't allow extended statistics on system attributes, - * and we require the data type to have less-than operator. + * and we require the data type to have a less-than operator. * - * There are many ways how to "mask" a simple attribute refenrece as an + * There are many ways to "mask" a simple attribute reference as an * expression, for example "(a+0)" etc. We can't possibly detect all of - * them, but we handle at least the simple case with attribute in parens. + * them, but we handle at least the simple case with the attribute in parens. * There'll always be a way around this, if the user is determined (like * the "(a+0)" example), but this makes it somewhat consistent with how * indexes treat attributes/expressions. */ foreach(cell, stmt->exprs) { StatsElem *selem = lfirst_node(StatsElem, cell); if (selem->name) /* column reference */ { char *attname;