]> granicus.if.org Git - postgresql/commitdiff
Inline hot path of slot_getsomeattrs().
authorAndres Freund <andres@anarazel.de>
Fri, 16 Nov 2018 18:25:34 +0000 (10:25 -0800)
committerAndres Freund <andres@anarazel.de>
Fri, 16 Nov 2018 18:29:01 +0000 (10:29 -0800)
This yields a minor speedup, which roughly balances the loss from the
upcoming introduction of callbacks to do some operations on slots.

Author: Andres Freund
Discussion: https://postgr.es/m/20181105210039.hh4vvi4vwoq5ba2q@alap3.anarazel.de

src/backend/executor/execExprInterp.c
src/backend/executor/execTuples.c
src/backend/jit/llvm/llvmjit.c
src/backend/jit/llvm/llvmjit_expr.c
src/backend/jit/llvm/llvmjit_types.c
src/include/executor/tuptable.h
src/include/jit/llvmjit.h

index 9f61ef76c2fc651568f61bcc9540e07deffb0bbd..1f9f583cfbbda68201c84f0ba911b060b8a17b16 100644 (file)
@@ -428,7 +428,6 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
                {
                        CheckOpSlotCompatibility(op, innerslot);
 
-                       /* XXX: worthwhile to check tts_nvalid inline first? */
                        slot_getsomeattrs(innerslot, op->d.fetch.last_var);
 
                        EEO_NEXT();
index 2cd7e5c86698728a5207bf82f3935f0cf10b00b5..4d92cf12699683c3554970694bcb1fce13c8df32 100644 (file)
@@ -1183,22 +1183,19 @@ slot_getattr(TupleTableSlot *slot, int attnum, bool *isnull)
 }
 
 /*
- * slot_getsomeattrs
- *             This function forces the entries of the slot's Datum/isnull
- *             arrays to be valid at least up through the attnum'th entry.
+ * slot_getsomeattrs_int - workhorse for slot_getsomeattrs()
  */
 void
-slot_getsomeattrs(TupleTableSlot *slot, int attnum)
+slot_getsomeattrs_int(TupleTableSlot *slot, int attnum)
 {
        HeapTuple       tuple;
        int                     attno;
 
-       /* Quick out if we have 'em all already */
-       if (slot->tts_nvalid >= attnum)
-               return;
+       /* Check for caller errors */
+       Assert(slot->tts_nvalid < attnum); /* slot_getsomeattr checked */
+       Assert(attnum > 0);
 
-       /* Check for caller error */
-       if (attnum <= 0 || attnum > slot->tts_tupleDescriptor->natts)
+       if (unlikely(attnum > slot->tts_tupleDescriptor->natts))
                elog(ERROR, "invalid attribute number %d", attnum);
 
        /*
@@ -1209,9 +1206,7 @@ slot_getsomeattrs(TupleTableSlot *slot, int attnum)
        if (tuple == NULL)                      /* internal error */
                elog(ERROR, "cannot extract attribute from empty tuple slot");
 
-       /*
-        * load up any slots available from physical tuple
-        */
+       /* Fetch as many attributes as possible from the underlying tuple. */
        attno = HeapTupleHeaderGetNatts(tuple->t_data);
        attno = Min(attno, attnum);
 
@@ -1220,13 +1215,14 @@ slot_getsomeattrs(TupleTableSlot *slot, int attnum)
        attno = slot->tts_nvalid;
 
        /*
-        * If tuple doesn't have all the atts indicated by attnum, read the rest
-        * as NULLs or missing values
+        * If the underlying tuple doesn't have enough attributes, tuple descriptor
+        * must have the missing attributes.
         */
-       if (attno < attnum)
-               slot_getmissingattrs(slot, attno, attnum);
-
-       slot->tts_nvalid = attnum;
+       if (unlikely(slot->tts_nvalid < attnum))
+       {
+               slot_getmissingattrs(slot, slot->tts_nvalid, attnum);
+               slot->tts_nvalid = attnum;
+       }
 }
 
 /* ----------------------------------------------------------------
index 168072afd2f4c2389b242833598680cab30802dc..16519079e33bb4379f29fa7575893dd451b3610f 100644 (file)
@@ -79,7 +79,7 @@ LLVMTypeRef StructAggStatePerTransData;
 LLVMValueRef AttributeTemplate;
 LLVMValueRef FuncStrlen;
 LLVMValueRef FuncVarsizeAny;
-LLVMValueRef FuncSlotGetsomeattrs;
+LLVMValueRef FuncSlotGetsomeattrsInt;
 LLVMValueRef FuncSlotGetmissingattrs;
 LLVMValueRef FuncMakeExpandedObjectReadOnlyInternal;
 LLVMValueRef FuncExecEvalArrayRefSubscript;
@@ -820,7 +820,7 @@ llvm_create_types(void)
        AttributeTemplate = LLVMGetNamedFunction(mod, "AttributeTemplate");
        FuncStrlen = LLVMGetNamedFunction(mod, "strlen");
        FuncVarsizeAny = LLVMGetNamedFunction(mod, "varsize_any");
-       FuncSlotGetsomeattrs = LLVMGetNamedFunction(mod, "slot_getsomeattrs");
+       FuncSlotGetsomeattrsInt = LLVMGetNamedFunction(mod, "slot_getsomeattrs_int");
        FuncSlotGetmissingattrs = LLVMGetNamedFunction(mod, "slot_getmissingattrs");
        FuncMakeExpandedObjectReadOnlyInternal = LLVMGetNamedFunction(mod, "MakeExpandedObjectReadOnlyInternal");
        FuncExecEvalArrayRefSubscript = LLVMGetNamedFunction(mod, "ExecEvalArrayRefSubscript");
index 4cee35f582cc33f604bed82aaa506ec86264f214..1725f6d0be4d064a39b20ab1925d01534ddd43aa 100644 (file)
@@ -345,7 +345,7 @@ llvm_compile_expr(ExprState *state)
                                                params[1] = l_int32_const(op->d.fetch.last_var);
 
                                                LLVMBuildCall(b,
-                                                                         llvm_get_decl(mod, FuncSlotGetsomeattrs),
+                                                                         llvm_get_decl(mod, FuncSlotGetsomeattrsInt),
                                                                          params, lengthof(params), "");
                                        }
 
index 855a6977ee5fa2986b439146f5bb46fd176928fb..92d37fb1e5b456c67368ea33c08d77a8f237668f 100644 (file)
@@ -97,7 +97,7 @@ void     *referenced_functions[] =
 {
        strlen,
        varsize_any,
-       slot_getsomeattrs,
+       slot_getsomeattrs_int,
        slot_getmissingattrs,
        MakeExpandedObjectReadOnlyInternal,
        ExecEvalArrayRefSubscript,
index 7e6b40acb1e1483c150093362e436016307d9f12..9470d385309be0801511a86ccfb547247d435887 100644 (file)
@@ -219,7 +219,6 @@ extern void slot_getmissingattrs(TupleTableSlot *slot, int startAttNum,
                                         int lastAttNum);
 extern Datum slot_getattr(TupleTableSlot *slot, int attnum,
                         bool *isnull);
-extern void slot_getsomeattrs(TupleTableSlot *slot, int attnum);
 
 /* in access/common/heaptuple.c */
 extern bool slot_attisnull(TupleTableSlot *slot, int attnum);
@@ -227,9 +226,21 @@ extern bool slot_getsysattr(TupleTableSlot *slot, int attnum,
                                Datum *value, bool *isnull);
 extern Datum getmissingattr(TupleDesc tupleDesc,
                           int attnum, bool *isnull);
+extern void slot_getsomeattrs_int(TupleTableSlot *slot, int attnum);
 
 #ifndef FRONTEND
 
+/*
+ * This function forces the entries of the slot's Datum/isnull arrays to be
+ * valid at least up through the attnum'th entry.
+ */
+static inline void
+slot_getsomeattrs(TupleTableSlot *slot, int attnum)
+{
+       if (slot->tts_nvalid < attnum)
+               slot_getsomeattrs_int(slot, attnum);
+}
+
 /*
  * slot_getallattrs
  *             This function forces all the entries of the slot's Datum/isnull
index 3eae5e68319ba9ea513a7a3c9aac487cef579ef1..05c9740bc5e0b4ce91386df072cb512e1794627f 100644 (file)
@@ -77,8 +77,8 @@ extern LLVMTypeRef StructAggStatePerGroupData;
 extern LLVMValueRef AttributeTemplate;
 extern LLVMValueRef FuncStrlen;
 extern LLVMValueRef FuncVarsizeAny;
-extern LLVMValueRef FuncSlotGetsomeattrs;
 extern LLVMValueRef FuncSlotGetmissingattrs;
+extern LLVMValueRef FuncSlotGetsomeattrsInt;
 extern LLVMValueRef FuncMakeExpandedObjectReadOnlyInternal;
 extern LLVMValueRef FuncExecEvalArrayRefSubscript;
 extern LLVMValueRef FuncExecEvalSysVar;