From b0c1c53a4338f1982a44006af205917d3a8e0670 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter_e@gmx.net>
Date: Tue, 24 Oct 2000 20:16:48 +0000
Subject: [PATCH] Integer binary operators, from Marko Kreen <marko@l-t.ee>. 
 Renamed bitxor operator to '#' for consistency.  Parser still needs work.

---
 doc/src/sgml/oper.sgml            |  32 +++++++-
 src/backend/utils/adt/int.c       | 120 +++++++++++++++++++++++++++++-
 src/backend/utils/adt/int8.c      |  64 +++++++++++++++-
 src/include/catalog/pg_operator.h |  25 ++++++-
 src/include/catalog/pg_proc.h     |  40 +++++++++-
 src/include/utils/builtins.h      |  15 +++-
 src/include/utils/int8.h          |   9 ++-
 7 files changed, 297 insertions(+), 8 deletions(-)

diff --git a/doc/src/sgml/oper.sgml b/doc/src/sgml/oper.sgml
index 495f3caefc6..deb3d33cde8 100644
--- a/doc/src/sgml/oper.sgml
+++ b/doc/src/sgml/oper.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/Attic/oper.sgml,v 1.20 2000/10/04 15:47:45 petere Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/Attic/oper.sgml,v 1.21 2000/10/24 20:13:31 petere Exp $
 -->
 
  <Chapter Id="operators">
@@ -493,6 +493,36 @@ logical union
 	<ENTRY>Cube root</ENTRY>
 	<ENTRY>||/ 27.0</ENTRY>
        </ROW>
+       <ROW>
+	<ENTRY> & </ENTRY>
+	<ENTRY>Binary AND</ENTRY>
+	<ENTRY>91 & 15</ENTRY>
+       </ROW>
+       <ROW>
+	<ENTRY> | </ENTRY>
+	<ENTRY>Binary OR</ENTRY>
+	<ENTRY>32 | 3</ENTRY>
+       </ROW>
+       <ROW>
+	<ENTRY> # </ENTRY>
+	<ENTRY>Binary XOR</ENTRY>
+	<ENTRY>15 # 4</ENTRY>
+       </ROW>
+       <ROW>
+	<ENTRY> ~ </ENTRY>
+	<ENTRY>Binary NOT</ENTRY>
+	<ENTRY>~1</ENTRY>
+       </ROW>
+       <ROW>
+	<ENTRY> &lt;&lt; </ENTRY>
+	<ENTRY>Binary shift left</ENTRY>
+	<ENTRY>1 &lt;&lt; 4</ENTRY>
+       </ROW>
+       <ROW>
+	<ENTRY> &gt;&gt; </ENTRY>
+	<ENTRY>Binary shift right</ENTRY>
+	<ENTRY>8 &gt;&gt; 2</ENTRY>
+       </ROW>
       </TBODY>
      </TGROUP>
     </TABLE>
diff --git a/src/backend/utils/adt/int.c b/src/backend/utils/adt/int.c
index b1153c30d17..4f786784eb7 100644
--- a/src/backend/utils/adt/int.c
+++ b/src/backend/utils/adt/int.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/int.c,v 1.42 2000/08/01 18:29:35 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/int.c,v 1.43 2000/10/24 20:14:35 petere Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -843,3 +843,121 @@ int4smaller(PG_FUNCTION_ARGS)
 
 	PG_RETURN_INT32((arg1 < arg2) ? arg1 : arg2);
 }
+
+/* Binary arithmetics
+ *
+ *		int[24]and		- returns arg1 & arg2
+ *		int[24]or		- returns arg1 | arg2
+ *		int[24]xor		- returns arg1 # arg2
+ *		int[24]not		- returns ~arg1
+ *		int[24]shl		- returns arg1 << arg2
+ *		int[24]shr		- returns arg1 >> arg2
+ */
+
+Datum
+int4and(PG_FUNCTION_ARGS)
+{
+	int32		arg1 = PG_GETARG_INT32(0);
+	int32		arg2 = PG_GETARG_INT32(1);
+
+	PG_RETURN_INT32(arg1 & arg2);
+}
+
+Datum
+int4or(PG_FUNCTION_ARGS)
+{
+	int32		arg1 = PG_GETARG_INT32(0);
+	int32		arg2 = PG_GETARG_INT32(1);
+
+	PG_RETURN_INT32(arg1 | arg2);
+}
+
+Datum
+int4xor(PG_FUNCTION_ARGS)
+{
+	int32		arg1 = PG_GETARG_INT32(0);
+	int32		arg2 = PG_GETARG_INT32(1);
+
+	PG_RETURN_INT32(arg1 ^ arg2);
+}
+
+Datum
+int4shl(PG_FUNCTION_ARGS)
+{
+	int32		arg1 = PG_GETARG_INT32(0);
+	int32		arg2 = PG_GETARG_INT32(1);
+
+	PG_RETURN_INT32(arg1 << arg2);
+}
+
+Datum
+int4shr(PG_FUNCTION_ARGS)
+{
+	int32		arg1 = PG_GETARG_INT32(0);
+	int32		arg2 = PG_GETARG_INT32(1);
+
+	PG_RETURN_INT32(arg1 >> arg2);
+}
+
+Datum
+int4not(PG_FUNCTION_ARGS)
+{
+	int32		arg1 = PG_GETARG_INT32(0);
+
+	PG_RETURN_INT32(~arg1);
+}
+
+Datum
+int2and(PG_FUNCTION_ARGS)
+{
+	int16		arg1 = PG_GETARG_INT16(0);
+	int16		arg2 = PG_GETARG_INT16(1);
+
+	PG_RETURN_INT16(arg1 & arg2);
+}
+
+Datum
+int2or(PG_FUNCTION_ARGS)
+{
+	int16		arg1 = PG_GETARG_INT16(0);
+	int16		arg2 = PG_GETARG_INT16(1);
+
+	PG_RETURN_INT16(arg1 | arg2);
+}
+
+Datum
+int2xor(PG_FUNCTION_ARGS)
+{
+	int16		arg1 = PG_GETARG_INT16(0);
+	int16		arg2 = PG_GETARG_INT16(1);
+
+	PG_RETURN_INT16(arg1 ^ arg2);
+}
+
+Datum
+int2not(PG_FUNCTION_ARGS)
+{
+	int16		arg1 = PG_GETARG_INT16(0);
+
+	PG_RETURN_INT16(~arg1);
+}
+
+
+Datum
+int2shl(PG_FUNCTION_ARGS)
+{
+	int16		arg1 = PG_GETARG_INT16(0);
+	int32		arg2 = PG_GETARG_INT32(1);
+
+	PG_RETURN_INT16(arg1 << arg2);
+}
+
+Datum
+int2shr(PG_FUNCTION_ARGS)
+{
+	int16		arg1 = PG_GETARG_INT16(0);
+	int32		arg2 = PG_GETARG_INT32(1);
+
+	PG_RETURN_INT16(arg1 >> arg2);
+}
+
diff --git a/src/backend/utils/adt/int8.c b/src/backend/utils/adt/int8.c
index b88fc5c45b0..bc4b64b9ec4 100644
--- a/src/backend/utils/adt/int8.c
+++ b/src/backend/utils/adt/int8.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/int8.c,v 1.24 2000/07/28 05:07:41 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/int8.c,v 1.25 2000/10/24 20:14:35 petere Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -591,6 +591,68 @@ int48div(PG_FUNCTION_ARGS)
 	PG_RETURN_INT64(val1 / val2);
 }
 
+/* Binary arithmetics
+ *
+ *		int8and		- returns arg1 & arg2
+ *		int8or		- returns arg1 | arg2
+ *		int8xor		- returns arg1 # arg2
+ *		int8not		- returns ~arg1
+ *		int8shl		- returns arg1 << arg2
+ *		int8shr		- returns arg1 >> arg2
+ */
+
+Datum
+int8and(PG_FUNCTION_ARGS)
+{
+	int64		arg1 = PG_GETARG_INT64(0);
+	int64		arg2 = PG_GETARG_INT64(1);
+
+	PG_RETURN_INT64(arg1 & arg2);
+}
+
+Datum
+int8or(PG_FUNCTION_ARGS)
+{
+	int64		arg1 = PG_GETARG_INT64(0);
+	int64		arg2 = PG_GETARG_INT64(1);
+
+	PG_RETURN_INT64(arg1 | arg2);
+}
+
+Datum
+int8xor(PG_FUNCTION_ARGS)
+{
+	int64		arg1 = PG_GETARG_INT64(0);
+	int64		arg2 = PG_GETARG_INT64(1);
+
+	PG_RETURN_INT64(arg1 ^ arg2);
+}
+
+Datum
+int8not(PG_FUNCTION_ARGS)
+{
+	int64		arg1 = PG_GETARG_INT64(0);
+
+	PG_RETURN_INT64(~arg1);
+}
+
+Datum
+int8shl(PG_FUNCTION_ARGS)
+{
+	int64		arg1 = PG_GETARG_INT64(0);
+	int32		arg2 = PG_GETARG_INT32(1);
+
+	PG_RETURN_INT64(arg1 << arg2);
+}
+
+Datum
+int8shr(PG_FUNCTION_ARGS)
+{
+	int64		arg1 = PG_GETARG_INT64(0);
+	int32		arg2 = PG_GETARG_INT32(1);
+
+	PG_RETURN_INT64(arg1 >> arg2);
+}
 
 /*----------------------------------------------------------
  *	Conversion operators.
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index cf97d29516c..219652fbea7 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_operator.h,v 1.82 2000/09/15 18:45:27 tgl Exp $
+ * $Id: pg_operator.h,v 1.83 2000/10/24 20:15:45 petere Exp $
  *
  * NOTES
  *	  the genbki.sh script reads this file and generates .bki
@@ -727,7 +727,7 @@ DATA(insert OID = 1788 (  "<="	  PGUID 0 b t f 1560 1560	16 1789 1787	0	 0 bitle
 DATA(insert OID = 1789 (  ">="	  PGUID 0 b t f 1560 1560	16 1788 1786	0	 0 bitge scalargtsel scalargtjoinsel ));
 DATA(insert OID = 1791 (  "&"	  PGUID 0 b t f 1560 1560 1560 1791    0	0	 0 bitand - - ));
 DATA(insert OID = 1792 (  "|"	  PGUID 0 b t f 1560 1560 1560 1792    0	0	 0 bitor - - ));
-DATA(insert OID = 1793 (  "^"	  PGUID 0 b t f 1560 1560 1560 1793    0	0	 0 bitxor - - ));
+DATA(insert OID = 1793 (  "#"	  PGUID 0 b t f 1560 1560 1560 1793    0	0	 0 bitxor - - ));
 DATA(insert OID = 1794 (  "~"	  PGUID 0 l t f    0 1560 1560	  0    0	0	 0 bitnot - - ));
 DATA(insert OID = 1795 (  "<<"	  PGUID 0 b t f 1560   23 1560	  0    0	0	 0 bitshiftleft - - ));
 DATA(insert OID = 1796 (  ">>"	  PGUID 0 b t f 1560   23 1560	  0    0	0	 0 bitshiftright - - ));
@@ -754,6 +754,27 @@ DATA(insert OID = 1871 ( ">"	   PGUID 0 b t f  20  21  16  1864 1872   0  0 int8
 DATA(insert OID = 1872 ( "<="	   PGUID 0 b t f  20  21  16  1867 1871   0  0 int82le scalarltsel scalarltjoinsel ));
 DATA(insert OID = 1873 ( ">="	   PGUID 0 b t f  20  21  16  1866 1870   0  0 int82ge scalargtsel scalargtjoinsel ));
 
+DATA(insert OID = 1874 ( "&"	   PGUID 0 b t f  21  21  21  1874    0   0  0 int2and - - ));
+DATA(insert OID = 1875 ( "|"	   PGUID 0 b t f  21  21  21  1875    0   0  0 int2or - - ));
+DATA(insert OID = 1876 ( "#"	   PGUID 0 b t f  21  21  21  1876    0   0  0 int2xor - - ));
+DATA(insert OID = 1877 ( "~"	   PGUID 0 l t f   0  21  21     0    0   0  0 int2not - - ));
+DATA(insert OID = 1878 ( "<<"	   PGUID 0 b t f  21  23  21     0    0   0  0 int2shl - - ));
+DATA(insert OID = 1879 ( ">>"	   PGUID 0 b t f  21  23  21     0    0   0  0 int2shr - - ));
+
+DATA(insert OID = 1880 ( "&"	   PGUID 0 b t f  23  23  23  1880    0   0  0 int4and - - ));
+DATA(insert OID = 1881 ( "|"	   PGUID 0 b t f  23  23  23  1881    0   0  0 int4or - - ));
+DATA(insert OID = 1882 ( "#"	   PGUID 0 b t f  23  23  23  1882    0   0  0 int4xor - - ));
+DATA(insert OID = 1883 ( "~"	   PGUID 0 l t f   0  23  23     0    0   0  0 int4not - - ));
+DATA(insert OID = 1884 ( "<<"	   PGUID 0 b t f  23  23  23     0    0   0  0 int4shl - - ));
+DATA(insert OID = 1885 ( ">>"	   PGUID 0 b t f  23  23  23     0    0   0  0 int4shr - - ));
+
+DATA(insert OID = 1886 ( "&"	   PGUID 0 b t f  20  20  20  1886    0   0  0 int8and - - ));
+DATA(insert OID = 1887 ( "|"	   PGUID 0 b t f  20  20  20  1887    0   0  0 int8or - - ));
+DATA(insert OID = 1888 ( "#"	   PGUID 0 b t f  20  20  20  1888    0   0  0 int8xor - - ));
+DATA(insert OID = 1889 ( "~"	   PGUID 0 l t f   0  20  20     0    0   0  0 int8not - - ));
+DATA(insert OID = 1890 ( "<<"	   PGUID 0 b t f  20  23  20     0    0   0  0 int8shl - - ));
+DATA(insert OID = 1891 ( ">>"	   PGUID 0 b t f  20  23  20     0    0   0  0 int8shr - - ));
+
 /*
  * function prototypes
  */
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 66ffa87e473..1748e1ea947 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_proc.h,v 1.169 2000/10/11 15:31:13 pjw Exp $
+ * $Id: pg_proc.h,v 1.170 2000/10/24 20:15:45 petere Exp $
  *
  * NOTES
  *	  The script catalog/genbki.sh reads this file and generates .bki
@@ -2513,6 +2513,44 @@ DESCR("less-than-or-equal");
 DATA(insert OID = 1861 (  int82ge		   PGUID 12 f t t t 2 f 16 "20 21" 100 0 0 100  int82ge - ));
 DESCR("greater-than-or-equal");
 
+DATA(insert OID = 1892 (  int2and		   PGUID 12 f t t t 2 f 21 "21 21" 100 0 0 100  int2and - ));
+DESCR("binary and");
+DATA(insert OID = 1893 (  int2or		   PGUID 12 f t t t 2 f 21 "21 21" 100 0 0 100  int2or - ));
+DESCR("binary or");
+DATA(insert OID = 1894 (  int2xor		   PGUID 12 f t t t 2 f 21 "21 21" 100 0 0 100  int2xor - ));
+DESCR("binary xor");
+DATA(insert OID = 1895 (  int2not		   PGUID 12 f t t t 1 f 21 "21" 100 0 0 100  int2not - ));
+DESCR("binary not");
+DATA(insert OID = 1896 (  int2shl		   PGUID 12 f t t t 2 f 21 "21 23" 100 0 0 100  int2shl - ));
+DESCR("binary shift left");
+DATA(insert OID = 1897 (  int2shr		   PGUID 12 f t t t 2 f 21 "21 23" 100 0 0 100  int2shr - ));
+DESCR("binary shift right");
+
+DATA(insert OID = 1898 (  int4and		   PGUID 12 f t t t 2 f 23 "23 23" 100 0 0 100  int4and - ));
+DESCR("binary and");
+DATA(insert OID = 1899 (  int4or		   PGUID 12 f t t t 2 f 23 "23 23" 100 0 0 100  int4or - ));
+DESCR("binary or");
+DATA(insert OID = 1900 (  int4xor		   PGUID 12 f t t t 2 f 23 "23 23" 100 0 0 100  int4xor - ));
+DESCR("binary xor");
+DATA(insert OID = 1901 (  int4not		   PGUID 12 f t t t 1 f 23 "23" 100 0 0 100  int4not - ));
+DESCR("binary not");
+DATA(insert OID = 1902 (  int4shl		   PGUID 12 f t t t 2 f 23 "23 23" 100 0 0 100  int4shl - ));
+DESCR("binary shift left");
+DATA(insert OID = 1903 (  int4shr		   PGUID 12 f t t t 2 f 23 "23 23" 100 0 0 100  int4shr - ));
+DESCR("binary shift right");
+
+DATA(insert OID = 1904 (  int8and		   PGUID 12 f t t t 2 f 20 "20 20" 100 0 0 100  int8and - ));
+DESCR("binary and");
+DATA(insert OID = 1905 (  int8or		   PGUID 12 f t t t 2 f 20 "20 20" 100 0 0 100  int8or - ));
+DESCR("binary or");
+DATA(insert OID = 1906 (  int8xor		   PGUID 12 f t t t 2 f 20 "20 20" 100 0 0 100  int8xor - ));
+DESCR("binary xor");
+DATA(insert OID = 1907 (  int8not		   PGUID 12 f t t t 1 f 20 "20" 100 0 0 100  int8not - ));
+DESCR("binary not");
+DATA(insert OID = 1908 (  int8shl		   PGUID 12 f t t t 2 f 20 "20 23" 100 0 0 100  int8shl - ));
+DESCR("binary shift left");
+DATA(insert OID = 1909 (  int8shr		   PGUID 12 f t t t 2 f 20 "20 23" 100 0 0 100  int8shr - ));
+DESCR("binary shift right");
 
 /*
  * prototypes for functions pg_proc.c
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index c3b9b2d0bc9..446c33cc420 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: builtins.h,v 1.139 2000/09/25 16:36:36 tgl Exp $
+ * $Id: builtins.h,v 1.140 2000/10/24 20:16:47 petere Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -127,6 +127,19 @@ extern Datum int2smaller(PG_FUNCTION_ARGS);
 extern Datum int4larger(PG_FUNCTION_ARGS);
 extern Datum int4smaller(PG_FUNCTION_ARGS);
 
+extern Datum int4and(PG_FUNCTION_ARGS);
+extern Datum int4or(PG_FUNCTION_ARGS);
+extern Datum int4xor(PG_FUNCTION_ARGS);
+extern Datum int4not(PG_FUNCTION_ARGS);
+extern Datum int4shl(PG_FUNCTION_ARGS);
+extern Datum int4shr(PG_FUNCTION_ARGS);
+extern Datum int2and(PG_FUNCTION_ARGS);
+extern Datum int2or(PG_FUNCTION_ARGS);
+extern Datum int2xor(PG_FUNCTION_ARGS);
+extern Datum int2not(PG_FUNCTION_ARGS);
+extern Datum int2shl(PG_FUNCTION_ARGS);
+extern Datum int2shr(PG_FUNCTION_ARGS);
+
 /* name.c */
 extern Datum namein(PG_FUNCTION_ARGS);
 extern Datum nameout(PG_FUNCTION_ARGS);
diff --git a/src/include/utils/int8.h b/src/include/utils/int8.h
index 83791f281bb..9ebe8efc6dd 100644
--- a/src/include/utils/int8.h
+++ b/src/include/utils/int8.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: int8.h,v 1.23 2000/07/28 05:07:44 tgl Exp $
+ * $Id: int8.h,v 1.24 2000/10/24 20:16:48 petere Exp $
  *
  * NOTES
  * These data types are supported on all 64-bit architectures, and may
@@ -76,6 +76,13 @@ extern Datum int8mod(PG_FUNCTION_ARGS);
 extern Datum int8larger(PG_FUNCTION_ARGS);
 extern Datum int8smaller(PG_FUNCTION_ARGS);
 
+extern Datum int8and(PG_FUNCTION_ARGS);
+extern Datum int8or(PG_FUNCTION_ARGS);
+extern Datum int8xor(PG_FUNCTION_ARGS);
+extern Datum int8not(PG_FUNCTION_ARGS);
+extern Datum int8shl(PG_FUNCTION_ARGS);
+extern Datum int8shr(PG_FUNCTION_ARGS);
+
 extern Datum int84pl(PG_FUNCTION_ARGS);
 extern Datum int84mi(PG_FUNCTION_ARGS);
 extern Datum int84mul(PG_FUNCTION_ARGS);
-- 
GitLab